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)

ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)

2014ACM/ICPC亚洲区域赛牡丹江站现场赛-A ( ZOJ 3819 ) Average Score