日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sdut 2141 BFS(用邻接矩阵和邻接表(采用优先队列)实现

發(fā)布時間:2025/4/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sdut 2141 BFS(用邻接矩阵和邻接表(采用优先队列)实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Problem Description

給定一個無向連通圖,頂點(diǎn)編號從0到n-1,用廣度優(yōu)先搜索(BFS)遍歷,輸出從某個頂點(diǎn)出發(fā)的遍歷序列。(同一個結(jié)點(diǎn)的同層鄰接點(diǎn),節(jié)點(diǎn)編號小的優(yōu)先遍歷)

Input

輸入第一行為整數(shù)n(0< n <100),表示數(shù)據(jù)的組數(shù)。
對于每組數(shù)據(jù),第一行是三個整數(shù)k,m,t(0<k<100,0<m<(k-1)*k/2,0< t<k),表示有m條邊,k個頂點(diǎn),t為遍歷的起始頂點(diǎn)。
下面的m行,每行是空格隔開的兩個整數(shù)u,v,表示一條連接u,v頂點(diǎn)的無向邊。

Output

輸出有n行,對應(yīng)n組輸出,每行為用空格隔開的k個整數(shù),對應(yīng)一組數(shù)據(jù),表示BFS的遍歷結(jié)果。

Example Input

1 6 7 0 0 3 0 4 1 4 1 5 2 3 2 4 3 5

Example Output

0 3 4 2 5 1

Hint

以鄰接矩陣作為存儲結(jié)構(gòu)。

#include <bits/stdc++.h> using namespace std; int k,m,t; int edge[105][105],vis[105]; void BFS(int n0) {queue<int>Q;int s,flag=0;vis[n0]=1;Q.push(n0);while(!Q.empty()){s=Q.front();Q.pop();if(!flag){cout<<s;flag=1;}elsecout<<' '<<s;for(int i=0;i<k;++i)if(!vis[i]&&edge[s][i]){vis[i]=1;Q.push(i);}}cout<<endl; } int main() {int n,p,q;cin>>n;while(n--){memset(edge,0,sizeof(edge));memset(vis,0,sizeof(vis));cin>>k>>m>>t;for(int i=0;i<m;++i){cin>>p>>q;edge[p][q]=edge[q][p]=1;}BFS(t);}return 0; }/*************************************************** User name: YT1658506207邵雪源 Result: Accepted Take time: 0ms Take Memory: 244KB Submit time: 2017-11-14 19:29:26 ****************************************************/用優(yōu)先隊列替代鄰接表的形式實現(xiàn)的:

#include <bits/stdc++.h> using namespace std; int vis[105],k,m,t; priority_queue<int ,vector<int>,greater<int> > s[105]; //相當(dāng)于定義一個鄰接表的結(jié)構(gòu) void BFS(int n0) {int ss,flag=0;queue<int>Q;//還是一個維護(hù)隊列vis[n0]=1;Q.push(n0);while(!Q.empty()){ss=Q.front();Q.pop();if(!flag){flag=1;cout<<ss;}elsecout<<' '<<ss;while(!s[ss].empty())//相當(dāng)于一個組數(shù)形式的鄰接表中的一個頭節(jié)點(diǎn)(而且只后的數(shù)值都因為是優(yōu)先隊列而按照從小到大的順序排列好了)一次訪問之后與之有邊的節(jié)點(diǎn){int r=s[ss].top();//取它的隊列首元素if(!vis[r])//如果沒被標(biāo)記{vis[r]=1;Q.push(r);//就加入q隊列中}s[ss].pop();}} } int main() {int n,p,q;cin>>n;while(n--){cin>>k>>m>>t;for(int k=1;k<=m;++k)//因為這組數(shù)據(jù)只用到1...m之間的大小while(!s[k].empty())s[k].pop();for(int k=0;k<m;++k){cin>>p>>q;s[p].push(q);s[q].push(p);}BFS(t);} }/*************************************************** User name: YT1658506207邵雪源 Result: Accepted Take time: 0ms Take Memory: 208KB Submit time: 2017-11-14 20:39:33 ****************************************************/

總結(jié)

以上是生活随笔為你收集整理的sdut 2141 BFS(用邻接矩阵和邻接表(采用优先队列)实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。