生活随笔
收集整理的這篇文章主要介紹了
NYOJ 20 吝啬的国度 广度优先搜索
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
吝嗇的國度
時間限制:
1000?ms ?|? 內(nèi)存限制:
65535?KB 難度:
3
描述
在一個吝嗇的國度里有N個城市,這N個城市間只有N-1條路把這個N個城市連接起來。現(xiàn)在,Tom在第S號城市,他有張該國地圖,他想知道如果自己要去參觀第T號城市,必須經(jīng)過的前一個城市是幾號城市(假設你不走重復的路)。 輸入第一行輸入一個整數(shù)M表示測試數(shù)據(jù)共有M(1<=M<=5)組
每組測試數(shù)據(jù)的第一行輸入一個正整數(shù)N(1<=N<=100000)和一個正整數(shù)S(1<=S<=100000),N表示城市的總個數(shù),S表示參觀者所在城市的編號
隨后的N-1行,每行有兩個正整數(shù)a,b(1<=a,b<=N),表示第a號城市和第b號城市之間有一條路連通。輸出每組測試數(shù)據(jù)輸N個正整數(shù),其中,第i個數(shù)表示從S走到i號城市,必須要經(jīng)過的上一個城市的編號。(其中i=S時,請輸出-1)樣例輸入 1
10 1
1 9
1 8
8 10
10 3
8 6
1 2
10 4
9 5
3 7
樣例輸出 -1 1 10 10 9 8 3 1 1 8
前兩天剛學過圖論中的最短路,今天做這道題,首先想到了用最短路的思想做。寫了一個Bellman-Ford,超時了,原因是頂點數(shù)*邊數(shù)太大。然后用廣搜寫了一下,AC。存儲邊時用了vector,記得每次都要清空vector。
[cpp]?view plaincopy #include<stdio.h>?? #include<string.h>?? #include<vector>?? #include<queue>?? using?namespace?std;?? const?int?N?=?100010;?? int?pre[N],?vis[N],?n,?s;?? vector<int>?vec[N];?? void?Init()?? {?? ????for(int?i?=?1;?i?<=?n;?i++)?? ????????pre[i]?=?i,?vis[i]?=?0;?? ????pre[s]?=?-1;?? }?? void?bfs()?? {?? ????queue<int>?Q;?? ????Q.push(s);?? ????while(!Q.empty())?? ????{?? ????????int?t?=?Q.front();?? ????????Q.pop();?? ????????if(vis[t])?? ????????????continue;?? ????????vis[t]?=?1;?? ????????for(int?i?=?0;?i?<?vec[t].size();?i++)?? ????????{?? ????????????int?p?=?vec[t][i];?? ????????????if(!vis[p])?? ????????????{?? ????????????????pre[p]?=?t;?? ????????????????Q.push(p);?? ????????????}?? ????????}?? ????}?? }?? int?main()?? {?? ????int?t,?i;?? ????scanf("%d",&t);?? ????while(t--)?? ????{?? ????????memset(vec,?0,?sizeof(vec));?? ????????scanf("%d%d",&n,&s);?? ????????int?a,?b;?? ????????for(i?=?0;?i?<?n?-?1;?i++)?? ????????{?? ????????????scanf("%d%d",&a,&b);?? ????????????vec[a].push_back(b);?? ????????????vec[b].push_back(a);?? ????????}?? ????????Init();?? ????????bfs();?? ????????printf("%d",pre[1]);?? ????????for(i?=?2;?i?<=?n;?i++)?? ????????????printf("?%d",pre[i]);?? ????????printf("\n");?? ????}?? ????return?0;?? }??
后來看討論區(qū),出題人說是把無根樹轉(zhuǎn)化為有根樹,仔細一想,還真是。下面是代碼:
[cpp]?view plaincopy ?? #include<stdio.h>?? #include<string.h>?? #include<vector>?? using?namespace?std;?? const?int?N?=?100010;?? int?pre[N],?n,?s;?? vector<int>?vec[N];?? void?Init()?? {?? ????for(int?i?=?1;?i?<=?n;?i++)?? ????????pre[i]?=?i;?? ????pre[s]?=?-1;?? }?? void?dfs(int?u,?int?fa)?? {?? ????int?k?=?vec[u].size();?? ????for(int?i?=?0;?i?<?k;?i++)?? ????{?? ????????int?v?=?vec[u][i];?? ????????if(v?!=?fa)?? ????????{?? ????????????pre[v]?=?u;?? ????????????dfs(v,?u);?? ????????}?? ????}?? }?? int?main()?? {?? ????int?t,?i;?? ????scanf("%d",&t);?? ????while(t--)?? ????{?? ????????memset(vec,?0,?sizeof(vec));?? ????????scanf("%d%d",&n,&s);?? ????????int?a,?b;?? ????????for(i?=?0;?i?<?n?-?1;?i++)?? ????????{?? ????????????scanf("%d%d",&a,&b);?? ????????????vec[a].push_back(b);?? ????????????vec[b].push_back(a);?? ????????}?? ????????Init();?? ????????dfs(s,-1);??? ????????printf("%d",pre[1]);?? ????????for(i?=?2;?i?<=?n;?i++)?? ????????????printf("?%d",pre[i]);?? ????????printf("\n");?? ????}?? ????return?0;?? } ?
總結(jié)
以上是生活随笔為你收集整理的NYOJ 20 吝啬的国度 广度优先搜索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。