Codeforces Round #485(div 2) D
题目描述
n: 城镇的数量
m: 道路的数量
k: 商品种类的数量
s: 举办展览会所需商品种类的最小值
a[i]: 城镇i拥有的商品种类
思路
对于任意商品\(i\), 使用广搜bfs求出送到任意城镇\(j\)所需的最小花费\(dis[i][j]\)即可
求dis的时间复杂度为\(O(km)\)
代码
#include <bits/stdc++.h>
using namespace std;
int n,m,k,s;
int cst[100005];
vector<int> v[100005]; // 邻接表保存稀疏图
vector<int> gud[105]; // 拥有展品i的城市
int dis[105][100005]; // dis[i][j]为把展品i运送到城市j的最小花费
void bfs(vector<int> g,int* d) {
//int ans=1;
queue<int> q;
fill(d+1,d+1+n,-1);
for(int x:g) {
q.push(x);
d[x]=0;
}
while(!q.empty()) {
int l=q.front();
q.pop();
for(int k:v[l]) {
if(d[k]==-1) {
d[k]=d[l]+1;
q.push(k);
}
}
}
}
int main() {
cin>>n>>m>>k>>s;
for(int i=1; i<=n; i++) {
int bb;
cin>>bb;
gud[bb].push_back(i);
}
for(int i=1; i<=m; i++) {
int a,b;
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
for(int i=1; i<=k; i++) {
bfs(gud[i],dis[i]);
}
for(int i=1; i<=n; i++) {
vector<int> v;
for(int j=1; j<=k; j++)
v.push_back(dis[j][i]);
sort(v.begin(),v.end());
cout<<accumulate(v.begin(),v.begin()+s,0)<<" ";
}
return 0;
}