如 果 从 每 种 货 物 开 始 b f s 是 n 2 的 如果从每种货物开始bfs是n^2的 如果从每种货物开始bfs是n2的
但 是 k 只 有 100 , 可 以 把 同 一 种 类 型 的 货 物 一 起 b f s 但是k只有100,可以把同一种类型的货物一起bfs 但是k只有100,可以把同一种类型的货物一起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;
}