ACM/ICPC 之 BFS范例(ZOJ2913)
Posted GUARDIAN
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM/ICPC 之 BFS范例(ZOJ2913)相关的知识,希望对你有一定的参考价值。
通过一道经典BFS例题阐述BFS思路
ZOJ2913-Bus Pass
题意:找一个center区域,使得center到所有公交线路最短,有等距的center则输出id最小的。
题解:经典的BFS,由公交线路最多只经过10*20个区域,而总区域数可达10^5个,因此应该从公交线路通过队列一层层向外扩展,最后判断一次center的位置即可。
1 //选定一个center使得其到所有公交线路最短 2 //对所有公交线路进行BFS(公交线路比其他区域少得多) 3 //Time:150Ms Memory:2840K 4 #include<iostream> 5 #include<cstring> 6 #include<cstdio> 7 #include<queue> 8 #include<vector> 9 using namespace std; 10 11 #define MAX 10005 12 #define max(x,y) ((x)>(y)?(x):(y)) 13 14 int nz, nr; 15 int td[MAX]; //临时距离记录-并充当已访问记录 16 int d[MAX]; //总距离记录 17 bool trip[MAX]; //记录所有公交线路 18 vector<int> zones[MAX]; //邻接表 19 20 void bfs(int x) 21 { 22 memset(td, 0, sizeof(td)); 23 queue<int> qz; //queue_zones 24 td[x] = 1; 25 qz.push(x); 26 while (!qz.empty()) 27 { 28 int cur = qz.front(); 29 qz.pop(); 30 for (int i = 0; i < zones[cur].size(); i++) 31 { 32 int adj = zones[cur].at(i); 33 if (!td[adj]) { 34 td[adj] = max(td[adj], td[cur] + 1); 35 qz.push(adj); 36 } 37 } 38 d[cur] = max(d[cur], td[cur]); 39 } 40 } 41 42 int main() 43 { 44 int T; 45 scanf("%d", &T); 46 while (T--) 47 { 48 //Init 49 memset(trip, false, sizeof(trip)); 50 memset(d, 0, sizeof(d)); 51 memset(zones, 0, sizeof(zones)); 52 53 //Input 54 scanf("%d%d", &nz, &nr); 55 for (int i = 0; i < nz; i++) 56 { 57 int id, adj; //adjacent 58 scanf("%d%d", &id, &adj); 59 while (adj--) { 60 int num; 61 scanf("%d", &num); 62 zones[id].push_back(num); 63 } 64 } 65 for (int i = 0; i < nr; i++) 66 { 67 int id,sum; 68 scanf("%d", &sum); 69 while (sum--) 70 { 71 scanf("%d", &id); 72 if (!trip[id]) { //未遍历过 73 trip[id] = true; //记录为公交线路 74 bfs(id); 75 } 76 } 77 } 78 79 //Output 80 int minstep = MAX; 81 int minid; 82 for (int i = 0; i < MAX; i++) 83 if (d[i] && minstep > d[i]) 84 minstep = d[minid = i]; //保证id最小+最小距离 85 86 printf("%d %d\n", minstep, minid); 87 } 88 89 return 0; 90 }
以上是关于ACM/ICPC 之 BFS范例(ZOJ2913)的主要内容,如果未能解决你的问题,请参考以下文章
ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))
ACM/ICPC 之 拓扑排序+DFS(POJ1128(ZOJ1083))
ACM/ICPC 之 差分约束系统两道(ZOJ2770-POJ1201)
ACM/ICPC 之 Floyd练习六道(ZOJ2027-POJ2253-POJ2472-POJ1125-POJ1603-POJ2607)