POJ 1172 DFS
POJ 1172 DFS
POJ 1172 DFS
POJ 1172 DFS
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();
}

相关文章:

  • 2021-12-19
  • 2021-10-05
  • 2022-03-05
  • 2021-09-29
  • 2022-02-04
  • 2021-09-02
  • 2022-12-23
  • 2021-09-24
猜你喜欢
  • 2021-08-29
  • 2022-02-27
  • 2021-10-27
  • 2021-08-02
  • 2021-07-30
  • 2021-10-22
  • 2021-07-27
相关资源
相似解决方案