nyoj 115-城市平乱 (BFS)

115-城市平乱


内存限制:64MB 时间限制:1000ms 特判: No
通过数:5 提交数:8 难度:4

题目描述:

南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。

他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。

现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱。

现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间。

注意,两个城市之间可能不只一条路。

输入描述:

第一行输入一个整数T,表示测试数据的组数。(T<20)
每组测试数据的第一行是四个整数N,M,P,Q(1<=N<=100,N<=M<=1000,M-1<=P<=100000)其中N表示部队数,M表示城市数,P表示城市之间的路的条数,Q表示发生暴乱的城市编号。
随后的一行是N个整数,表示部队所在城市的编号。
再之后的P行,每行有三个正整数,a,b,t(1<=a,b<=M,1<=t<=100),表示a,b之间的路如果行军需要用时为t

数据保证暴乱的城市是可达的。

输出描述:

对于每组测试数据,输出第一支部队到达叛乱城市时的时间。每组输出占一行

样例输入:

1
3 8 9 8
1 2 3
1 2 1
2 3 2
1 4 2
2 5 3
3 6 2
4 7 1
5 7 3
5 8 2
6 8 2 

样例输出:

4

 

C/C++:

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <stack>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <climits>
11 #include <bitset>
12 #define eps 1e-6
13 using namespace std;
14 
15 int n, m, p, q, my_book[1010], my_map[1010][1010];
16 
17 struct node
18 {
19     bool has_army;
20     int cnt;
21 }my_army[1010];
22 
23 int bfs()
24 {
25     int my_ans = INT_MAX, q1;
26     queue <int> Q;
27     Q.push(q);
28     my_book[q] = 1;
29     while (!Q.empty())
30     {
31         q1 = Q.front();
32         for (int i = 1; i <= m; ++ i)
33         {
34             if (my_book[i] || !my_map[q1][i]) continue;
35             my_book[i] = 1;
36             my_army[i].cnt = my_army[q1].cnt + my_map[q1][i];
37             Q.push(i);
38             if (my_army[i].has_army && my_army[i].cnt < my_ans) my_ans = my_army[i].cnt;
39         }
40         Q.pop();
41     }
42     return my_ans;
43 }
44 
45 int main()
46 {
47     ios::sync_with_stdio(false);
48     int t;
49     scanf("%d", &t);
50     while (t --)
51     {
52         /**
53             initialize
54         */
55         memset(my_army, 0, sizeof (my_army));
56         memset(my_book, 0, sizeof (my_book));
57         memset(my_map, 0, sizeof (my_map));
58 
59         /**
60             Date input
61         */
62         scanf("%d%d%d%d",&n, &m, &p, &q);
63         for (int i = 0; i < n; ++ i)
64         {
65             int temp;
66             scanf("%d", &temp);
67             my_army[temp].has_army = true;
68         }
69         for (int i = 0; i < p; ++ i)
70         {
71             int a, b, a_b_distance;
72             scanf("%d%d%d", &a, &b, &a_b_distance);
73             my_map[a][b] = my_map[b][a] = a_b_distance;
74         }
75 
76         /**
77             get answer
78         */
79         printf("%d\n", bfs());
80     }
81 
82     return 0;
83 }

 

posted @ 2018-08-03 16:27  GetcharZp  阅读(148)  评论(0编辑  收藏  举报