zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    Spring Boot ELK Kafka 自定义断路器Circuit-Breaker
    据库主体在该数据库中拥有架构,无法删除解决方法
    AlloyImage
    引用嵌入式DLL方法
    C# C++ 字符串传递
    高效取图片像素的方法
    Microsoft Active Accessibility
    IIS配置支持APK下载
    C# gettime实现
    android快捷键
  • 原文地址:https://www.cnblogs.com/lucianosimon/p/9113303.html
Copyright © 2011-2022 走看看