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;
}
原文地址:https://www.cnblogs.com/lucianosimon/p/9113303.html