Fair CodeForces - 987D(巧妙bfs)
Posted wtsruvf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fair CodeForces - 987D(巧妙bfs)相关的知识,希望对你有一定的参考价值。
题意:
有n个城市 m条边,每条边的权值为1,每个城市生产一种商品(可以相同,一共k种),求出分别从每个城市出发获得s种商品时所走过路的最小权值
解析:
我们倒过来想,不用城市找商品,而是商品找城市,求出每个商品到达每个城市的最短路,w[i][j]即为生产商品j的城市到达城市i的最短路,最后对于每个i排序w[i] 取前s个小的即可
#include <bits/stdc++.h> #define mem(a, b) memset(a, b, sizeof(a)) using namespace std; const int maxn = 1001000, INF = 0x7fffffff; typedef long long LL; vector<int> G[maxn]; int n, m, k, s; int w[maxn][105]; //w[i][j] 生产j商品的城市到i城市的最短路 void bfs(int x) { queue<int> Q; Q.push(x+n); while(!Q.empty()) { int u = Q.front(); Q.pop(); for(int i=0; i<G[u].size(); i++) { int v = G[u][i]; if(w[v][x] == 0) { w[v][x] = w[u][x] + 1; //目的就是找到生产j商品的城市(无论哪一个)到i城市的最短路 Q.push(v); } } } } int main() { int u, v, c; scanf("%d%d%d%d", &n, &m, &k, &s); for(int i=1; i<=n; i++) { scanf("%d", &c); G[c+n].push_back(i); } for(int i=0; i<m; i++) { scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } for(int i=1; i<=k; i++) bfs(i); for(int i=1; i<=n; i++) { int res = 0; sort(w[i]+1, w[i]+k+1); //把k个商品分别到i城市的最短路排序,累加最小的s个 for(int j=1; j<=s; j++) res += w[i][j] - 1; //因为每次是从商品开始广搜的 每个商品多加了一个1 printf("%d ", res); } return 0; }
以上是关于Fair CodeForces - 987D(巧妙bfs)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #485 (Div. 2) D. Fair
codeforces 897A Scarborough Fair 暴力签到