题解 CF986A 【Fair】

这道题目,我们可以用BFS和最短路径解决。

先来理一理思路吧!

首先,建一个边表,这样就可以存下这张图,建议使用vector

然后,使用BFS算出最短路径。

最后用快排选出其中较短的距离,算出答案。

谔谔,这不就OK了么?

代码:

#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;
}
View Code

 

posted @ 2020-08-08 15:15  Bushuai_Tang  阅读(78)  评论(0编辑  收藏  举报