[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 }
相關文章
相關標籤/搜索