1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| #include <bits/stdc++.h> #pragma GCC optimize(2) using namespace std; #define INF 0x3f3f3f3f #define LC(x) (x<<1) #define RC(x) ((x<<1)+1) #define MID(x,y) ((x+y)>>1) #define pb push_back #define sf(x) scanf("%d", &x) #define sfl(x) scanf("%lld", &x) #define all(a) (a).begin(),(a).end() #define clr(arr,val) memset(arr,val,sizeof(arr)) #define FAST_IO ios::sync_with_stdio(false);cin.tie(0); #define caseT int _T;scanf("%d",&_T);for (int q=1; q<=_T; ++q) typedef pair<int, int> pii;
typedef long long ll; const double PI = acos(-1.0); const int N = 1e5 + 7; int n, m, k, s, a[N], d[N];
struct edge { int to, nxt; edge() {} edge(int _to, int _nxt): to(_to), nxt(_nxt) {} } E[N << 1]; int head[N], tot; vector<int> dis[N];
void init() { clr(head, -1); } void add(int s, int t) { E[tot] = edge(t, head[s]); head[s] = tot++; E[tot] = edge(s, head[t]); head[t] = tot++; } void bfs(int c) { queue<int>Q; clr(d, INF); for (register int i = 1; i <= n; ++i) if (a[i] == c) d[i] = 0, Q.push(i); while (!Q.empty()) { int u = Q.front(); Q.pop(); for (register int i = head[u]; ~i; i = E[i].nxt) { int &v = E[i].to; if (d[v] > d[u] + 1) { d[v] = d[u] + 1; Q.push(v); } } } for (register int i = 1; i <= n; ++i) dis[i].pb(d[i]); } int main(void) { init(); int i, x, y; sf(n), sf(m), sf(k), sf(s); for (i = 1; i <= n; ++i) sf(a[i]); for (i = 0; i < m; ++i) { sf(x), sf(y); add(x, y); } for (i = 1; i <= k; ++i) bfs(i); for (i = 1; i <= n; ++i) { nth_element(dis[i].begin(), dis[i].begin() + s, dis[i].end()); printf("%d%c", accumulate(dis[i].begin(), dis[i].begin() + s, 0), " \n"[i == n]); } return 0; }
|