题解 CF986A 【Fair】
这道题目,我们可以用BFS和最短路径解决。
先来理一理思路吧!
首先,建一个边表,这样就可以存下这张图,建议使用vector。
然后,使用BFS算出最短路径。
最后用快排选出其中较短的距离,算出答案。
谔谔,这不就OK了么?
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define MAXN 100001 using namespace std; int n,m; int k,s; int a[MAXN],b[MAXN]; int f[101][MAXN]; queue<int>q; vector<int>Edge[MAXN]; int read() { int x=0; char c=getchar(); while(!isdigit(c))c=getchar(); while(isdigit(c))x=x*10+c-48,c=getchar(); return x; } int main() { int i,j; n=read(); m=read(); k=read(); s=read(); for(i=1;i<=n;i++) { a[i]=read(); } for(i=1;i<=m;i++) { int u,v; u=read(); v=read(); Edge[u].push_back(v); Edge[v].push_back(u); } memset(f,0x3f3f3f,sizeof(f)); for(i=1;i<=k;i++) { while(!q.empty()) { q.pop(); } for(j=1;j<=n;j++) { if(a[j]==i) { f[i][j]=0; q.push(j); } } while(!q.empty()) { int now; now=q.front(); q.pop(); for(j=0;j<Edge[now].size();j++) { int nxt; nxt=Edge[now][j]; if(f[i][nxt]>f[i][now]+1) { f[i][nxt]=f[i][now]+1; q.push(nxt); } } } } for(i=1;i<=n;i++) { for(j=1;j<=k;j++) { b[j]=f[j][i]; } sort(b+1,b+k+1); long long ans; ans=0; for(j=1;j<=s;j++) { ans+=b[j]; } printf("%lld ",ans); } puts(""); return 0; }
不要妄图追上西坠的太阳,而是要在黎明前就等着它!