如 果 从 每 种 货 物 开 始 b f s 是 n 2 的 如果从每种货物开始bfs是n^2的 bfsn2

但 是 k 只 有 100 , 可 以 把 同 一 种 类 型 的 货 物 一 起 b f s 但是k只有100,可以把同一种类型的货物一起bfs k100,bfs

还 是 b f s 的 老 套 路 , 谁 先 到 保 留 谁 还是bfs的老套路,谁先到保留谁 bfs,

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define num first
#define d second
const int maxn=2e5+10;
int n,m,k,s,dis[maxn][109],vis[maxn],e[maxn];
typedef pair<int,int>p;
queue<p>q;
vector<int>vec[maxn],tu[maxn];
void bfs(int x)
{
    for(int i=0;i<vec[x].size();i++)
        q.push( p(vec[x][i],0) );//把所有种类是x的点放进去
    while(!q.empty())
    {
        p u=q.front();q.pop();
        dis[u.num][x]=min(u.d,dis[u.num][x]);
        for(int i=0;i<tu[u.num].size();i++)
        {
            int v=tu[u.num][i];
            if(vis[v])  continue;
            vis[v]=1;
            q.push( p(v,u.d+1) );
        }
    }
}
int main()
{
    cin >> n >> m >> k >> s;
    for(int i=1;i<=n;i++)
    {
        cin >> e[i];
        vec[ e[i] ].pb(i);
    }
    for(int i=1;i<=m;i++)
    {
        int l,r;
        cin >> l >> r;
        tu[l].pb(r),tu[r].pb(l);
    }
    memset(dis,20,sizeof(dis));
    for(int i=1;i<=k;i++)
    {
        bfs(i);
        memset(vis,0,sizeof(vis));
    }
    for(int i=1;i<=n;i++)
    {
        sort(dis[i]+1,dis[i]+1+k);
        int sumn=0;
        for(int j=1;j<=s;j++)   sumn+=dis[i][j];
        cout << sumn << " ";
    }
    return 0;
}