[20180824] noip模拟赛 Oasis


显然直接从这k个点分别跑一下到其他点的最短路即可

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 2e5 + 10, inf = 0x3f3f3f3f;
 4 int head[N], rest[N], to[N], tot;
 5 int n, m, k, lz[N];
 6 int dis[N], ans[N];
 7 
 8 void add(int u, int v) {
 9     to[++ tot] = v, rest[tot] = head[u], head[u] = tot;
10 }
11 
12 void bfs(int S) {
13     for(int i = 1 ; i <= n ; ++ i) dis[i] = inf;
14     dis[S] = 0;
15     queue<int> q;
16     q.push(S);
17     while(q.size()) {
18         int u = q.front(); q.pop();
19         for(int i = head[u] ; i ; i = rest[i]) {
20             int v = to[i];
21             if(dis[v] == inf) {
22                 dis[v] = dis[u] + 1;
23                 q.push(v);
24             }
25         }
26     }
27     for(int i = 1 ; i <= n ; ++ i) ans[i] = max(ans[i], dis[i]);
28 }
29 
30 int main() {
31     scanf("%d%d%d", &n, &m, &k);
32     for(int i = 1 ; i <= k ; ++ i) scanf("%d", &lz[i]);
33     for(int i = 1 ; i <= m ; ++ i) {
34         int u, v;
35         scanf("%d%d", &u, &v);
36         add(u, v), add(v, u);
37     }
38     for(int i = 1 ; i <= k ; ++ i) bfs(lz[i]);
39     for(int i = 1 ; i <= n ; ++ i) {
40         printf("%d", ans[i]);
41         if(i < n) putchar(' ');
42     }
43 }
[20180824] noip模拟赛 Oasis
posted @ 2018-08-24 15:54  KingSann  阅读(94)  评论(0编辑  收藏  举报