CF 987 D. Fair

D. Fair

http://codeforces.com/contest/987/problem/D

题意:

  n个城镇m条道路,(保证没有重边,两个城镇间可以到达),每个城镇拥有的特产ai(可能多个城镇有相同特产)。总共有k种不同特产。每个城镇举办展会需要至少s种特产,一份特产从一个城镇运到另一个城镇的花费为最短路(每次只能运一个)。求出在每个城镇举办展会的最小花费。

分析:

  bfs。

  如果直接枚举每个城镇作为举办展会,然后计算到每个特产的最短路,取出前s个,复杂度n^2。

  发现k<=100,所以可以反过来枚举,枚举每特产到每个城镇的最短路,多源bfs跑一下,最后枚举每个诚镇计算答案。

代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<cctype>
 7 #include<set>
 8 #include<vector>
 9 #include<queue>
10 #include<map>
11 #define fi(s) freopen(s,"r",stdin);
12 #define fo(s) freopen(s,"w",stdout);
13 using namespace std;
14 typedef long long LL;
15
16 inline int read() {
17     int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)f=-1;
18     for(;isdigit(ch);ch=getchar())x=x*10+ch-‘0‘;return x*f;
19 }
20
21 const int N = 100005;
22 const int INF = 1e9;
23
24 struct Edge{
25     int to, nxt;
26 }e[N << 1];
27 int head[N], En, dis[N][105], q[N];
28 vector<int> vec[105];
29
30 void add_edge(int u,int v) {
31     ++En; e[En].to = v; e[En].nxt = head[u]; head[u] = En;
32     ++En; e[En].to = u; e[En].nxt = head[v]; head[v] = En;
33 }
34
35 void bfs(int x) {
36     int L = 1, R = 0;
37     for (int sz = vec[x].size(), i = 0; i < sz; ++i) {
38         q[++R] = vec[x][i];
39         dis[vec[x][i]][x] = 0;
40     }
41     while (L <= R) {
42         int u = q[L++];
43         for (int i = head[u]; i; i = e[i].nxt) {
44             int v = e[i].to;
45             if (dis[v][x] == INF) {
46                 dis[v][x] = dis[u][x] + 1;
47                 q[++R] = v;
48             }
49         }
50     }
51 }
52
53 int main() {
54     int n = read(), m = read(), k = read(), s = read();
55     for (int i = 1; i <= n; ++i) vec[read()].push_back(i);
56     for (int i = 1; i <= m; ++i) {
57         int u = read(), v = read();
58         add_edge(u, v);
59     }
60     for (int i = 1; i <= k; ++i) {
61         for (int j = 1; j <= n; ++j) dis[j][i] = INF;
62         bfs(i);
63     }
64
65     for (int i = 1; i <= n; ++i) {
66         int ans = 0;
67         sort(dis[i] + 1, dis[i] + k + 1);
68         for (int j = 1; j <= s; ++j) ans += dis[i][j];
69         printf("%d ",ans);
70     }
71
72     return 0;
73 }

原文地址:https://www.cnblogs.com/mjtcn/p/9911755.html

时间: 2024-10-08 11:00:18

CF 987 D. Fair的相关文章

CF D. Fair(思维+DFS)

http://codeforces.com/contest/987/problem/D 题目大概: 给出一个n个城镇m条边的图,给出每个城镇拥有的特产(可能多个城镇有相同特产).有k种不同特产. 要求每个城镇需要其他城镇运输特产到自己的城镇,每个城镇必须拥有s种特产,那么在城镇满足s种特产后,需要的最短路径是多长,最短路指的是特产运输过来走过的边的数量. 分析: 一开始以为是道水题,因为我只要对每个点都进行一次DFS,那问题就很简单了,但是...细想下,这其实是不行的,因为会TLE. 那现在我们

CF 986A Fair——多源bfs

题目:http://codeforces.com/contest/986/problem/A 此题乍一看没什么不T的思路... 发现边权是1,bfs? 考虑朴素的想法,遍历所有的点,bfs,过程中更新出各种商品的最短路,然后排序加和-- 好像很不行,似乎有一大堆冗余的东西,主要因为每个点上只有一种商品啊: 不妨干脆换个思路,不是找每个点到每种商品的距离,而是找每种商品到每个点的距离,如何? 一种商品存在于多个点上,可以进行多源 bfs! 也就是 bfs 一开始的时候把多个点加进优先队列里,复杂度

一场CF的台前幕后(上)——转

前奏 大约4月份的时候,业界毒瘤pyx噔噔噔跑过来说:“酷爱!我YY了一道题!准备当CF的C” 我当时就被吓傻了."Yet another Chinese round?" “区间取模,区间求和” 感觉这题还不错?不过pyx嫌水了…… 好办!当时我刚刚出完动态仙人掌不久,于是一拍脑袋说:把这个问题出到仙人掌上去! 当然被pyx鄙视了…… 后来一直就没啥动静,直到5月底的CTSC. 试机的时候pyx给我看了套他出的神题……里面有一道题……我不小心读成了下面这个样子: “给定n个m维的模2意

Codeforces Round #485 (Div. 2) D. Fair

Codeforces Round #485 (Div. 2) D. Fair 题目连接: http://codeforces.com/contest/987/problem/D Description Some company is going to hold a fair in Byteland. There are $n$ towns in Byteland and $m$ two-way roads between towns. Of course, you can reach any t

微信 {&quot;errcode&quot;:40029,&quot;errmsg&quot;:&quot;invalid code, hints: [ req_id: Cf.y.a0389s108 ]&quot;}

{"errcode":40029,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]"} 问题:微信网页授权后,获取到 openid 了,一刷新又没了 微信网页授权获取到的 code 只能使用一次(5分钟内有效),使用一次后,马上失效. 页面授权跳转成功,根据 code 也换取到 openid 了. 此时刷新页面,并不会再次进行授权,而是直接刷新了一下上一次授权跳转后的链接,带的还是

CF with friends and user&#39;s influence considered on NYC data(updated Aug,11st)

Here is the code link: https://github.com/FassyGit/LightFM_liu/blob/master/U_F1.py I use NYC data as other experimens. The split of the training data was seperated by the timeline, and I have normalised the interaction matrix by replacing the checkin

CF 750

今天CF打的块残废了     就是一废物 A 在24点之前到 直接模拟即可 #include<stdio.h> #include<algorithm> #include<cstring> #include<string> #include<cmath> using namespace std; #define LL long long #define MAXN 1010 #define inf 1000000000.0 int main() {

CF #394 (2) 5/6

Codeforces Round #394 (Div. 2) 总结:有毒的一场比赛.做了三题,结果A被叉,B.C挂综测,还hack失败一发,第一次在CF体会到了-50分的感觉..不知道是不是人品好,比赛时room炸了,然后,unrated.. A  水题,判一下0 0,然后abs(a-b)<=1 B  水题,组个间距比较一下,但一个数的时候要判一下 C  直接暴力上的题 D  也是xjb暴力 题意:给出n,l,r, a[], p[],另有两个数组b[], c[],ci=bi-ai.l<=ai,

bzoj1664[Usaco2006 Open]County Fair Events 参加节日庆祝*

bzoj1664[Usaco2006 Open]County Fair Events 参加节日庆祝 题意: 有N个节日,每个节日有个开始时间,及持续时间.牛想尽可能多的参加节日,问最多可以参加多少.注意牛的转移速度是极快的,不花时间,且节日必须完整参加.N≤10000,开始时刻和持续时间≤100000. 题解: dp.设f[i]表示i时刻到最后时刻最多可以参加多少节日.则f[i]=max(f[i+1],f[range[j].r+1],j为时刻i开始的节日). 代码: 1 #include <cs