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;
}

猜你喜欢

转载自www.cnblogs.com/lucianosimon/p/9113303.html