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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NYOJ 20 吝啬的国度 广度优先搜索

發(fā)布時間:2025/6/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NYOJ 20 吝啬的国度 广度优先搜索 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

吝嗇的國度

時間限制:1000?ms ?|? 內(nèi)存限制:65535?KB 難度:3 描述
在一個吝嗇的國度里有N個城市,這N個城市間只有N-1條路把這個N個城市連接起來?,F(xiàn)在,Tom在第S號城市,他有張該國地圖,他想知道如果自己要去參觀第T號城市,必須經(jīng)過的前一個城市是幾號城市(假設(shè)你不走重復(fù)的路)。 輸入
第一行輸入一個整數(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

前兩天剛學(xué)過圖論中的最短路,今天做這道題,首先想到了用最短路的思想做。寫了一個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
  • /*無根樹轉(zhuǎn)有根樹,s即為根*/??
  • #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);?//從根節(jié)點開始搜??
  • ????????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)容還不錯,歡迎將生活随笔推薦給好友。