BZOJ 4579: [Usaco2016 Open]Closing the Farm

Posted 北屿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 4579: [Usaco2016 Open]Closing the Farm相关的知识,希望对你有一定的参考价值。

Description

依次删去一个点和它的边,问当前图是否连通.

Sol

并查集.

倒着做就可以了.

每次将一个点及其的边加入,如果当前集合个数大于 1,那么就不连通.

Code

/**************************************************************
    Problem: 4579
    User: BeiYu
    Language: C++
    Result: Accepted
    Time:2196 ms
    Memory:10328 kb
****************************************************************/
 
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
 
const int N = 200050;
 
int n,m,cs;
int b[N],p[N],f[N],ans[N];
vector< int > g[N];
 
inline int in(int x=0){ scanf("%d",&x);return x; }
int find(int x){ return f[x] == x ? x : f[x]=find(f[x]); }
int main(){
    n=in(),m=in();
    for(int i=1,u,v;i<=m;i++){
        u=in(),v=in();
        g[u].push_back(v),g[v].push_back(u);
    }
    for(int i=1;i<=n;i++) p[i]=in();
    for(int i=1;i<=n;i++) f[i]=i;
     
    for(int x=n,u,v;x;--x){
        cs++;
        u=p[x],b[u]=1;
        for(int i=0,lim=g[u].size();i<lim;i++){
            v=g[u][i];
            if(b[v]) if(find(u) != find(v)) f[find(u)]=find(v),cs--;
        }
        if(cs > 1) ans[x]=0;else ans[x]=1;
    }
    for(int i=1;i<=n;i++) if(ans[i]) puts("YES");else puts("NO");
    return 0;
}

  

以上是关于BZOJ 4579: [Usaco2016 Open]Closing the Farm的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4576Usaco2016 Open262144

bzoj4745: [Usaco2016 Dec]Cow Checklist

bzoj4509Usaco2016 JanAngry Cows

bzoj 4506: [Usaco2016 Jan]Fort Moo

bzoj4525: [Usaco2016 Jan]Angry Cows

BZOJ 4576: [Usaco2016 Open]262144