八中一共有被用M条双向道路连接的N个教室(1<=N,M<=3000)。为了关闭整个八中,master wen 计划每一次关
闭掉一个教室。当一个教室被关闭了,所有的连接到这个教室的道路都会被关闭,而且再也不能够被使用。master
wen现在正感兴趣于知道在每一个时间(这里的“时间”指在每一次关闭教室之前的时间)时他的八中是否是“全
连通的”——也就是说从任意的一个开着的教室开始,能够到达另外的一个教室。注意自从某一个时间之后,可能
整个八中都开始不会是“全连通的”。
标签:删掉 不难 解决 排名 最好 print font getc enter
本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
题目:
4 3
1 2
2 3
3 4
3
4
1
2
YES
NO
YES
YES
1 #include<bits/stdc++.h> 2 #pragma GCC optimize(3) 3 const int N=200001; 4 using namespace std; 5 int n,m,tot; 6 int ver[N*2],nxt[N*2],head[N],f[N],k[N]; 7 int sum; 8 bool flag[N]; 9 bool ans[N]; 10 void inint(){ 11 freopen("light.in","r",stdin); 12 freopen("light.out","w",stdout); 13 } 14 inline int read(){ 15 int x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();} 17 while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} 18 return x*f; 19 } 20 inline void write(int x) 21 { 22 if(x<0)x=-x,putchar(‘-‘); 23 if(x>9)write(x/10); 24 putchar(x%10+‘0‘); 25 } 26 void add(int x,int y){ 27 ++tot; 28 ver[tot]=y; 29 nxt[tot]=head[x]; 30 head[x]=tot; 31 } 32 int find(int fa){ 33 if(f[fa]==fa)return fa; 34 return f[fa]=find(f[fa]); 35 } 36 int main() 37 { 38 //inint(); 39 n=read(),m=read(); 40 for(int i=1;i<=n;i++){ 41 f[i]=i; 42 } 43 for(int i=1,x,y;i<=m;i++){ 44 x=read(),y=read(); 45 add(x,y); 46 add(y,x); 47 } 48 for(int i=1;i<=n;i++){ 49 k[i]=read(); 50 } 51 for(int i=n;i>=1;i--){ 52 sum++; 53 flag[k[i]]=true; 54 for(int j=head[k[i]];j;j=nxt[j]){ 55 int y=ver[j]; 56 if(flag[y]&&find(y)!=find(k[i])){ 57 f[find(y)]=f[find(k[i])]; 58 sum--; 59 } 60 } 61 if(sum==1)ans[i]=true; 62 } 63 for(int i=1;i<=n;i++){ 64 if(ans[i])printf("YES\n"); 65 else printf("NO\n"); 66 } 67 return 0; 68 } 69 /* 70 4 3 71 1 2 72 2 3 73 3 4 74 3 75 4 76 1 77 2 78 */
标签:删掉 不难 解决 排名 最好 print font getc enter
原文地址:https://www.cnblogs.com/nlyzl/p/11776244.html