bzoj 4579: [Usaco2016 Open]Closing the Farm
2016-05-21 11:37
302 查看
4579: [Usaco2016 Open]Closing the Farm
Description
Farmer John and his cows are planning to leave town for a long vacation, and so FJ wants to temporarily close down his farm to save money in the meantime.The farm consists of NN barns connected with MM bidirectional paths between some pairs of barns (1≤N,M≤200,000). To shut the farm down, FJ plans to close one barn at a time. When a barn closes, all paths adjacent to that barn also close, and can no longer be used.FJ is interested in knowing at each point in time (initially, and after each closing) whether his farm is "fully connected" -- meaning that it is possible to travel from any open barn to any other open barn along an appropriate series of paths. Since FJ's farm is initially in somewhat in a state of disrepair, it may not even start out fully connected.Input
The first line of input contains N and M. The next M lines each describe a path in terms of the pairof barns it connects (barns are conveniently numbered 1…N). The final N lines give a permutation o
f 1…N describing the order in which the barns will be closed.
Output
The output consists of N lines, each containing "YES" or "NO". The first line indicates whether theinitial farm is fully connected, and line i+1 indicates whether the farm is fully connected after th
e iith closing.
Sample Input
4 31 2
2 3
3 4
3
4
1
2
Sample Output
YESNO
YES
YES
题解:
首先这道题目什么意思呢???大概是讲用m条边连接的农场,每次关闭一个谷仓,问你每次在关闭谷仓之前整个农场是否完全联通。
知道意思后这就是到很裸的并查集了,维护联通块个数,看看是不是1就行了。。。
#include<stdio.h> #include<iostream> using namespace std; const int N=200005; int n,m,i,j,x,y,fx,fy,cnt,a ,p ,ans ,f ; int tot,head ,Next[N<<1],to[N<<1]; void add(int x,int y) { tot++; to[tot]=y; Next[tot]=head[x]; head[x]=tot; } int get(int x) { if(f[x]==x) return x;else return f[x]=get(f[x]); } int main() { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) head[i]=-1; for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); add(x,y); add(y,x); } for(i=1;i<=n;i++) f[i]=i; for(i=1;i<=n;i++) scanf("%d",&a[i]); cnt=0; for(i=n;i>=1;i--) { cnt++; x=a[i]; for(j=head[x];j!=-1;j=Next[j]) { y=to[j]; if(p[y]==1) { fx=get(x); fy=get(y); if(fx!=fy) { cnt--; f[fx]=fy; } } } ans[i]=cnt; p[x]=1; } for(i=1;i<=n;i++) if(ans[i]==1) printf("YES\n");else printf("NO\n"); return 0; }
相关文章推荐
- 网站如何添加访客统计代码
- linux下利用gcc编译C和C++
- 应用监控插件pinpoint安装
- String 类 Copy-On-Write 技术以及使用时存在的风险
- 解决linux下WINDOWS下记事本乱码问题
- xshell不能连接VM中的ubuntu
- 关于tomcat 部署项目的思考
- linux下man命令的使用
- 网站受攻击的常用手段
- 服务器发布tomcat的WEB项目供外网访问
- 网站受攻击的常用手段
- 交友网站模板颜色对网站至关重要
- TOMCAT的目录结构 1++ Tomact的一些小配置2++Java Web开发: Tomcat中部署项目的三种方法
- opencv学习笔记(三)基本数据类型
- NSOperation
- 9、Linux驱动的杂项设备
- linux内存,free命令介绍
- cmake使用笔记和Creating CMake Linux projects with Visual Studio
- Linux 系列(一)——Nginx 安装手册
- Java千百问_07JVM架构(002)_jvm实例的结构是什么样的