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 temporar
ily close down his farm to save money in the meantime.The farm consists of NN barns connected with M
M 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 ca
n no longer be used.FJ is interested in knowing at each point in time (initially, and after each clo
sing) whether his farm is "fully connected" -- meaning that it is possible to travel from any open b
arn to any other open barn along an appropriate series of paths. Since FJ's farm is initially in som
ewhat 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 pair
of 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 the
initial farm is fully connected, and line i+1 indicates whether the farm is fully connected after th
e iith closing.
Sample Input
4 3
1 2
2 3
3 4
3
4
1
2
1 2
2 3
3 4
3
4
1
2
Sample Output
YES
NO
YES
YES
NO
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[N],p[N],ans[N],f[N]; int tot,head[N],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; }