POJ 1172 DFS

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
(感谢wzc学长的幻灯片)
单组数据 注意从必经点能到标记过的点则此点不是分裂点。

//By: Sirius_Ren
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int tot=1,first[51],cnt,v[101],nxt[101],n,vis[51],ansx=0,ansy=0,j,k;
queue<int> p,q,r;
void add(int x,int y){v[tot]=y,nxt[tot]=first[x],first[x]=tot++;}
int main()
{
    memset(first,-1,sizeof(first));
    for(cnt=0;~n;cnt++)
        while(scanf("%d",&n)&&n>=0)add(cnt,n);
    cnt--;
    for(int i=1;i<cnt;i++){
        memset(vis,0,sizeof(vis));
        q.push(0);vis[i]=1;
        while(!q.empty()){
            int t=q.front();q.pop();
            vis[t]=1;
            for(int l=first[t];~l;l=nxt[l])
                if(!vis[v[l]])q.push(v[l]);
        }
        if(!vis[cnt]){
            ansx++,p.push(i);
            for(j=0;j<=cnt;j++)
                if(!vis[j]||j==i)
                    for(k=first[j];~k;k=nxt[k])
                        if(vis[v[k]]&&v[k]!=i)goto end;
            ansy++,r.push(i);
            end:;
        }
    }
    printf("%d",ansx);
    while(!p.empty())printf(" %d",p.front()),p.pop();
    printf("\n");
    printf("%d",ansy);
    while(!r.empty())printf(" %d",r.front()),r.pop();
}
posted @ 2016-05-22 17:36  SiriusRen  阅读(144)  评论(0编辑  收藏  举报