[USACO16OPEN]关闭农场Closing the Farm_Silver

题目描述

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.html

The farm consists of NNN barns connected with MMM bidirectional paths between some pairs of barns (1≤N,M≤30001 \leq N, M \leq 30001N,M3000). 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.app

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.spa

FJ和他的奶牛们正在计划离开小镇作一次长的旅行,同时FJ想临时地关掉他的农场以节省一些金钱。rest

这个农场一共有被用M条双向道路链接的N个谷仓(1<=N,M<=3000)。为了关闭整个农场,FJ 计划每一次关闭掉一个谷仓。当一个谷仓被关闭了,全部的链接到这个谷仓的道路都会被关闭,并且不再可以被使用。code

FJ如今正感兴趣于知道在每个时间(这里的“时间”指在每一次关闭谷仓以后的时间)时他的农场是不是“全连通的”——也就是说从任意的一个开着的谷仓开始,可以到达另外的一个谷仓。注意自从某一个时间以后,可能整个农场都开始不会是“全连通的”。htm

输入输出格式

输入格式:

The first line of input contains NNN and MMM. The next MMM lines each describe ablog

path in terms of the pair of barns it connects (barns are conveniently numberedinput

1…N1 \ldots N1N). The final NNN lines give a permutation of 1…N1 \ldots N1Nit

describing the order in which the barns will be closed.io

输出格式:

The output consists of NNN lines, each containing "YES" or "NO". The first line

indicates whether the initial farm is fully connected, and line i+1i+1i+1 indicates

whether the farm is fully connected after the iiith closing.

输入输出样例

输入样例#1: 复制
4 3
1 2
2 3
3 4
3
4
1
2
输出样例#1: 复制
YES
NO
YES
YES

思路

倒序并查集;

代码

 1 #include<cstdio>
 2 const int maxn=6e3+10;
 3 int n,m,now;
 4 int s[maxn],f[maxn];
 5 bool v[maxn],u[maxn];
 6 int h[maxn],hs;
 7 int et[maxn],en[maxn];
 8 void add(){
 9     int u,v;
10     scanf("%d%d",&u,&v);
11     hs++,et[hs]=v,en[hs]=h[u],h[u]=hs;
12     hs++,et[hs]=u,en[hs]=h[v],h[v]=hs;
13 }
14 int ff(int k){return f[k]==k?k:f[k]=ff(f[k]);}
15 int main(){
16     scanf("%d%d",&n,&m);
17     for(int i=1;i<=m;i++) add();
18     for(int i=1;i<=n;i++) scanf("%d",&s[i]),f[i]=i;
19     int a,b;
20     for(int i=n;i>0;i--){
21         u[s[i]]=1,a=ff(s[i]);
22         for(int e=h[a];e;e=en[e])
23         if(u[et[e]]){
24             b=ff(et[e]);
25             if(a!=b) now++,f[b]=a;
26         }
27         if(now==n-i) v[i]=1;
28     }
29     for(int i=1;i<=n;i++){
30         if(v[i]) puts("YES");
31         else puts("NO");
32     }
33     return 0;
34 }
相关文章
相关标签/搜索