[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 }