CF986A Fair
题目描述
Some company is going to hold a fair in Byteland. There are n n n towns in Byteland and m m m two-way roads between towns. Of course, you can reach any town from any other town using roads.
There are k k k types of goods produced in Byteland and every town produces only one type. To hold a fair you have to bring at least s s s different types of goods. It costs d(u,v) d(u,v) d(u,v) coins to bring goods from town u u u to town v v v where d(u,v) d(u,v) d(u,v) is the length of the shortest path from u u u to v v v . Length of a path is the number of roads in this path.
The organizers will cover all travel expenses but they can choose the towns to bring goods from. Now they want to calculate minimum expenses to hold a fair in each of n n n towns.
输入输出格式
输入格式:
There are 4 4 4 integers n n n , m m m , k k k , s s s in the first line of input ( 1≤n≤105 1 \le n \le 10^{5} 1≤n≤105 , 0≤m≤105 0 \le m \le 10^{5} 0≤m≤105 , 1≤s≤k≤min(n,100) 1 \le s \le k \le min(n, 100) 1≤s≤k≤min(n,100)
) — the number of towns, the number of roads, the number of different
types of goods, the number of different types of goods necessary to hold
a fair.
In the next line there are n n n integers a1,a2,…,an a_1, a_2, \ldots, a_n a1,a2,…,an ( 1≤ai≤k 1 \le a_{i} \le k 1≤ai≤k ), where ai a_i ai is the type of goods produced in the i i i -th town. It is guaranteed that all integers between 1 1 1 and k k k occur at least once among integers ai a_{i} ai .
In the next m m m lines roads are described. Each road is described by two integers u u u v v v ( 1≤u,v≤n 1 \le u, v \le n 1≤u,v≤n , u≠v u \ne v u≠v
) — the towns connected by this road. It is guaranteed that there is no
more than one road between every two towns. It is guaranteed that you
can go from any town to any other town via roads.
输出格式:
Print n n n numbers, the i i i -th of them is the minimum number of coins you need to spend on travel expenses to hold a fair in town i i i . Separate numbers with spaces.
输入输出样例
7 6 3 2
1 2 3 3 2 2 1
1 2
2 3
3 4
2 5
5 6
6 7
1 1 1 2 2 1 1
题意:
n 个点,m 条边,有k种不同的物品,求从每个点出发收集s个不同物品的最短距离;
我们从每种物品 bfs;
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
//#include<cctype>
//#pragma GCC optimize(2)
using namespace std;
#define maxn 200005
#define inf 0x7fffffff
//#define INF 1e18
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdult(x) scanf("%lu",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod = 1e9 + 7;
#define Mod 1000000000
#define sq(x) (x)*(x)
#define eps 1e-4
typedef pair<int, int> pii;
#define pi acos(-1.0)
//const int N = 1005;
#define REP(i,n) for(int i=0;i<(n);i++)
typedef pair<int, int> pii;
inline ll rd() {
ll x = 0;
char c = getchar();
bool f = false;
while (!isdigit(c)) {
if (c == '-') f = true;
c = getchar();
}
while (isdigit(c)) {
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
return f ? -x : x;
} ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a%b);
}
int sqr(int x) { return x * x; } /*ll ans;
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (!b) {
x = 1; y = 0; return a;
}
ans = exgcd(b, a%b, x, y);
ll t = x; x = y; y = t - a / b * y;
return ans;
}
*/ int n, m, k, s;
vector<int>v[maxn];
vector<int>c[maxn];
int dis[100004][200];
bool vis[100004][200];
void bfs(int x) {
queue<int>q; ms(vis);
for (int i = 0; i < v[x].size(); i++) {
q.push(v[x][i]); dis[v[x][i]][x] = 0;
}
while (!q.empty()) {
int u = q.front(); q.pop(); vis[u][x] = 0;
for (int i = 0; i < c[u].size(); i++) {
int to = c[u][i];
if (dis[to][x] > dis[u][x] + 1) {
dis[to][x] = dis[u][x] + 1;
if (!vis[to][x]) {
q.push(to); vis[to][x] = 1;
}
}
}
}
} int main() {
//ios::sync_with_stdio(0);
cin >> n >> m >> k >> s;
memset(dis, 0x3f, sizeof(dis));
for (int i = 1; i <= n; i++) {
int x; rdint(x);
v[x].push_back(i);
}
for (int i = 1; i <= m; i++) {
int u, V; rdint(u); rdint(V);
c[V].push_back(u); c[u].push_back(V);
}
for (int i = 1; i <= k; i++)bfs(i);
for (int i = 1; i <= n; i++) {
sort(dis[i] + 1, dis[i] + 1 + k);
int ans = 0;
for (int j = 1; j <= s; j++)ans += dis[i][j];
cout << ans << " ";
}
return 0;
}
CF986A Fair的更多相关文章
- CF986A Fair【图论/BFS】
[题意]: 有些公司将在Byteland举办公平的会议.Byteland的n个城镇,m条两镇之间的双向道路.当然,你可以使用道路从任一个城镇到达任何城镇. 有k种商品产自Byteland,并且每个城镇 ...
- NOIP前刷题记录
因为本蒻实在太蒻了...对于即将到来的NOIP2018ssfd,所以下决心要把自己近期做过的题目(衡量标准为洛谷蓝题难度或以上)整理一下,归归类,简单地写一下思路,就当作自己复习了吧qwq 本随笔持续 ...
- NOIP刷题
搜索 [NOIP2013]华容道 最短路+带剪枝的搜索,是一个思维难度比较大的题目. CF1064D Labyrinth 考虑贪心,用双向队列bfs [NOIP2017]宝藏 剪枝搜索出奇迹 题解:h ...
- LA 3231 - Fair Share
You are given N processors and M jobs to be processed. Two processors are specified to each job. To ...
- Codeforces CF#628 Education 8 F. Bear and Fair Set
F. Bear and Fair Set time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- java线程 公平锁 ReentrantLock(boolean fair)
一.公平锁 1.为什么有公平锁 CPU在调度线程的时候是在等待队列里随机挑选一个线程,由于这种随机性所以是无法保证线程先到先得的(synchronized控制的锁就是这种非公平锁).但这样就会产生饥饿 ...
- Fair Scheduler 队列设置经验总结
Fair Scheduler 队列设置经验总结 由于公司的hadoop集群的计算资源不是很充足,需要开启yarn资源队列的资源抢占.在使用过程中,才明白资源抢占的一些特点.在这里总结一下. 只有一个队 ...
- Fair Scheduler中的Delay Schedule分析
延迟调度的主要目的是提高数据本地性(data locality),减少数据在网络中的传输.对于那些输入数据不在本地的MapTask,调度器将会延迟调度他们,而把slot分配给那些具备本地性的MapTa ...
- Hadoop学习之--Fair Scheduler作业调度分析
Fair Scheduler调度器同步心跳分配任务的过程简单来讲会经历以下环节: 1. 对map/reduce是否已经达到资源上限的循环判断 2. 对pool队列根据Fair算法排序 3.然后循环po ...
随机推荐
- C++中函数模版和普通函数的区别
函数模版和同名普通函数在同一个作用域中,会优先调用那个函数? 函数模型在进行调用的时候会进行严格的类型匹配,而普通函数在调用的时候,会进行函数参数类型转换(前提是自动类型转换). 调用函数模版,本质是 ...
- 【leetcode刷题笔记】Search a 2D Matrix
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- 本机不装Oracle,使用plsql连接远程Oracle的方法
由于Oracle的庞大,有时候我们需要在只安装Oracle客户端如plsql.toad等的情况下去连接远程数据库,可是没有安装Oracle就没有一切的配置文件去支持.最后终于发现一个很有效的方法,Or ...
- 【JSON解析】JSON解析
前三篇博客分别介绍了xml的三种解析方法,分别是SAX,DOM,PULL解析XML,兴趣的朋友可以去看一下这[XML解析(一)]SAX解析XML,[XML解析(二)]DOM解析XML,[XML解析(三 ...
- JS数组的sort排序
数组sort方法排序var aa=[6,2,1,5]//默认是从小到大排序aa.sort()[1, 2, 5, 6] //下面也是从小到大排序aa.sort(function(a,b){return ...
- Python脚本开头两行:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用
转于:https://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/ 出处:在路上 一.基本功能 1)#!/us ...
- Linux统计文件夹占用空间大小--du命令基本用法
命令行环境下要知道linux系统里一个文件夹以及其包含的文件实际所占用的空间大小,linux自带的命令 du可以很好地满足需求. 其他的用法我就不一一写出来了,就列本人觉得会用得最多的,直接上: $ ...
- Python-通过调用Nmap来进行端口扫描
首先要安装python-nmap库,还要安装配置好nmap 实验机器IP:192.168.220.139 端口开放情况 代码 # -*- coding:utf-8 -*- __author__ = & ...
- C笔试题(一)
a和b两个整数,不用if, while, switch, for,>, <, >=, <=, ?:,求出两者的较大值. 答案: int func(int a, int b) { ...
- javascript数字千分分隔符
function thousandBitSeparator(num) { num=num.toFixed(2); return num && num .toString() .repl ...