CodeForces - 986A Fair (BFS+贪心)
题意:有N个点M条边的无向图,每个点有给定的ai(1<=ai<=K,K<=200)表示该点拥有的物品编号,保证1-K在N个点全部出现。求每个点收集S个不同的物品所要走过的最短路程(边的长度为1)。
分析:N是1e5,如果直接对每个点搜索肯定超时。发现K的范围很小,而且1-K全部覆盖。那么考虑对所有1-K的值BFS,用一个二维数组dp[i][j]记录i点要获取编号为j的物品最少走过的路程,并对每个点取最小的S个物品对应的路径。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn =1e5+;
int a[maxn];
int res[maxn];
vector<int> G[maxn];
bool vis[maxn];
int d[maxn][];
void init(int N) {for(int i=;i<=N;++i) G[i].clear();}
void AddEdge(int u,int v){G[u].push_back(v);} void BFS(int val,int N)
{
memset(vis,,sizeof(vis));
queue<int> Q;
for(int i=;i<=N;++i){
if(a[i]==val){
vis[i]=true;
Q.push(i);
}
}
while(!Q.empty()){
int x =Q.front();Q.pop();
for(int i=;i<G[x].size();++i){
int v = G[x][i];
if(!vis[v]){
vis[v] = true;
d[v][val] = d[x][val]+;
Q.push(v);
}
}
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int N,M,K,S,u,v;
while(scanf("%d%d%d%d",&N,&M,&K,&S)==){
init(N);
memset(d,,sizeof(d));
for(int i=;i<=N;++i) scanf("%d",&a[i]);
for(int i=;i<=M;++i){
scanf("%d%d",&u,&v);
AddEdge(u,v);
AddEdge(v,u);
}
for(int i=;i<=K;++i){
memset(vis,,sizeof(vis));
BFS(i,N);
}
for(int i=;i<=N;++i){
sort(d[i]+,d[i]+K+);
res[i]=;
for(int j =;j<=S;++j){
res[i]+=d[i][j];
}
}
for(int i=;i<N;++i) printf("%d ",res[i]);
printf("%d\n",res[N]);
}
return ;
}
CodeForces - 986A Fair (BFS+贪心)的更多相关文章
- Codeforces 986A. Fair(对物品bfs暴力求解)
解题思路: 1.对物品i bfs,更新每个小镇j获得每个物品i的最短距离. 2.时间复杂度o(n*k),满足2s的要求. 代码: #include <iostream> #include ...
- CodeForces - 987D Fair (BFS求最短路)
题意:有N个城市,M条双向道路连接两个城市,整个图保证连通.有K种物品,但每个城市只有一种,现在它们都需要S种物品来举办展览,可以去其他城市获取该城市的物品,花费是两城市之间的最短路径长度.求每个城市 ...
- [CodeForces]986A Fair
大意:给一张图,每个图上有一个数,问以每个点为源点,经过的点包含k种数字的最小距离. 显然跑最短路会T,但我们注意到边权一定.某次学校考试就是类似题,可以bfs做,复杂度O(n),每种货物做一次,复杂 ...
- UVA12130 Summits(BFS + 贪心)
UVA12130 Summits(BFS + 贪心) 题目链接 题目大意: 给你一个h ∗ w 的矩阵,矩阵的每一个元素都有一个值,代表这个位置的高度. 题目要求你找出这个图中有多少个位置是峰值点.从 ...
- BFS+贪心 HDOJ 5335 Walk Out
题目传送门 /* 题意:求从(1, 1)走到(n, m)的二进制路径值最小 BFS+贪心:按照标程的作法,首先BFS搜索所有相邻0的位置,直到1出现.接下去从最靠近终点的1开始, 每一次走一步,不走回 ...
- codeforces 704B - Ant Man 贪心
codeforces 704B - Ant Man 贪心 题意:n个点,每个点有5个值,每次从一个点跳到另一个点,向左跳:abs(b.x-a.x)+a.ll+b.rr 向右跳:abs(b.x-a.x) ...
- HDU-1072 Nightmare (bfs+贪心)
Nightmare Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
- CodeForces - 50A Domino piling (贪心+递归)
CodeForces - 50A Domino piling (贪心+递归) 题意分析 奇数*偶数=偶数,如果两个都为奇数,最小的奇数-1递归求解,知道两个数都为1,返回0. 代码 #include ...
- CF 986A Fair——多源bfs
题目:http://codeforces.com/contest/986/problem/A 如果从每个村庄开始bfs找货物,会超时. 发现k较小.那就从货物开始bfs,给村庄赋上dis[ 该货物 ] ...
随机推荐
- 【SR】论文资源相关
1. Anchored Neighborhood Regression for Fast Example-Based Super-Resolution Radu Timofte, Vincent De ...
- Laravel5.1 模型 --远层一对多关系
远层一对多我们可以通过一个例子来充分的了解它: 每一篇文章都肯定有并且只有一个发布者 发布者可以有多篇文章,这是一个一对多的关系.一个发布者可以来自于一个国家 但是一个国家可以有多个发布者,这又是一个 ...
- VMThread占CPU高基本上是JVM在频繁GC导致,原因基本上是冰法下短时间内创建了大量对象堆积造成频繁GC。
今天线上一个java进程cpu负载100%.按以下步骤查出原因. 1.执行top -c命令,找到cpu最高的进程的id 2.执行top -H -p pid,这个命令就能显示刚刚找到的进程的所有线程的资 ...
- Linux下RPM包管理
概述 一种用于互联网下载包的打包及安装工具,它包含在某些linux分发版中.它生成具有.RPM扩展名的文件.RPM是Redhat Package Manager(Redhat软件包管理工具)的缩写.这 ...
- NHibernate 1.0 Released 版本发布了
NHibernate is a port of Hibernate to the .NET platform. Hibernate is the leading open-source object- ...
- 模态窗口原理及注意事项--http://www.alisdn.com/wordpress/?p=53
前言 在开发Windows引用程序的时候,在一些需要用户确认,或者提示用户注意的场合,经常使用模态对话框,或者叫模态窗口.在绝大多数情况下,模态窗口给开发人员带来了极大的便利,并且在某些应用上有不可替 ...
- 170210、JAVA中List、Map、Set的区别与选用
先了解下类层次关系: Collection ├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap └WeakHas ...
- 《JAVA多线程编程核心技术》 笔记:第二章:对象及变量的并发访问
一.基本概念1.安全的变量和不安全的变量2.脏读的理解3.锁重入:4.锁释放5.死循环:二.synchronized 的理解:三.synchronized 同步方法3.1 同步方法不具有继承性.3.2 ...
- 手动爬虫之糗事百科(ptyhon3)
一.调用封装的Url_ProxyHelper类,源码如下 import urllib.request as ur class Url_ProxyHelper: def __init__(self, u ...
- php 使用imagettftext()函数出问题的原因
<?php header('Content-type: image/png'); $im = imagecreatetruecolor(400, 300); //创建画布 $white = im ...