生活随笔
收集整理的這篇文章主要介紹了
BFS最短路
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
BFS是借助于隊(duì)列來存儲(chǔ),模擬的是數(shù)的按層遍歷
來源:周春樵
BFS來求最短路時(shí)間復(fù)雜度是O(n!)O(n!)O(n!)
下面代碼注釋詳細(xì)。
代碼
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>using namespace std
;typedef long long ll
;
const int maxn
=20;
int n
;
ll dis
[20];
int pre
[maxn
];
vector
<pair
<int,int> > v
[maxn
];
queue
<pair
<int ,int> > q
;
vector
<int> p
;
void bfs(){q
.push(make_pair(1,0));while(!q
.empty()){int x
=q
.front().first
;q
.pop();for(int i
=0;i
<v
[x
].size();i
++){int dx
=v
[x
][i
].first
;int dlen
=v
[x
][i
].second
;if(dis
[dx
]>dis
[x
]+dlen
){dis
[dx
]=dis
[x
]+dlen
;q
.push(make_pair(dx
,dlen
));pre
[dx
]=x
;} } }
}
void get_path(){for(int i
=n
;i
!=-1;i
=pre
[i
])p
.push_back(i
);
}int main(){cin
>>n
;memset(dis
,0x3f,sizeof(dis
));memset(pre
,-1,sizeof(pre
));int len
;for(int i
=1;i
<=n
;i
++)for(int j
=1;j
<=n
;j
++){cin
>>len
;v
[i
].push_back(make_pair(j
,len
));} dis
[1]=0;bfs(); cout
<<dis
[n
]<<endl
;vector
<int>::reverse_iterator it
;for(it
=p
.rbegin();it
!=p
.rend();it
++)cout
<<(*it
)<<" "; return 0;
}
總結(jié)
以上是生活随笔為你收集整理的BFS最短路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。