[P3144][USACO16OPEN]关闭农场Closing the Farm

来源:互联网 发布:会计软件的合法性 编辑:程序博客网 时间:2024/05/02 04:39

原题链接

倒着加进去

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#define MOD 1000000007#define LL long longusing namespace std;int n,m,i,j,fat[3005],num[6005],nxt[6005],head[3005],cnt,f[3005],a,b,c[3005],rot,ans[3005],r;void add(int p1,int p2){    cnt++;    num[cnt]=p2;    nxt[cnt]=head[p1];    head[p1]=cnt;}int find(int x){    int tmp;     if(fat[x]==x) return x;    tmp=find(fat[x]);    fat[x]=tmp;    return tmp;}int main(){    scanf("%d%d",&n,&m);    for(i=1;i<=n;i++)        fat[i]=i;    for(i=1;i<=m;i++)    {        scanf("%d%d",&a,&b);        add(a,b);        add(b,a);    }    for(i=1;i<=n;i++)        scanf("%d",&c[i]);    for(i=n;i>=1;i--)    {        f[c[i]]=1;        rot=0;        for(j=head[c[i]];j;j=nxt[j])            if(f[num[j]])            {                r=find(num[j]);                fat[r]=c[i];            }        for(j=1;j<=n;j++)            if(f[j]&&fat[j]==j) rot++;        if(rot>1) ans[i]=1;    }       for(i=1;i<=n;i++)    {        if(ans[i]) printf("NO\n");        else printf("YES\n");    }    return 0;}
阅读全文
0 0
原创粉丝点击