Section 4.3 Street Race

来源:互联网 发布:凯旋门信誉第一js 编辑:程序博客网 时间:2024/05/21 17:15

/*
ID: niepeng1
PROG: race3
LANG: C++
*/
/*
 基本上就是模拟。
 如果是不可绕过的节点,则通过去除该节点后,不会有路径通到最后一个节点(深搜)。
 如果是可分割节点,则去除该节点后从开始节点遍历 和 从该节点直接开始遍历应该没有可以重复到达的节点(深搜)。
*/
#include<iostream>
#include<algorithm>
#include<memory.h>
#include<math.h>
int a[51][100];
int unav[51],split[51];
bool get[51],ttem[51];
void Dfs(int s)
{
 int i;
 if(get[s]) return;
 get[s]=true;
 for(i=1;i<=a[s][0];i++)
  Dfs(a[s][i]);
}
int main()
{
 freopen("race3.in","r",stdin);
 freopen("race3.out","w",stdout);

 bool cond=false;
 int n,tem,i,j;
 for(n=0;;n++){
  a[n][0]=0;
  while(scanf("%d",&tem) && tem>=0){
   a[n][++a[n][0]]=tem;
  }
  if( tem == -1)
   break;
 }
 while(!a[n-1][0]) n--;


 unav[0]=0;split[0]=0;
 for(i=1;i<n;i++){
  memset(get,false,sizeof(get));
  get[i]=true;
  Dfs(0);
  if(!get[n]) unav[++unav[0]]=i;

  memcpy(ttem,get,sizeof(get));
  memset(get,false,sizeof(get));
  //get[i]=true;
  Dfs(i);
  cond=false;
  for(j=0;j<=n;j++){
   if(j!=i&&get[j] && ttem[j]){
     cond=true;
     break;
   }
  }
  if( !cond) split[++split[0]]=i;
 }
 for(i=0;i<=unav[0];i++)
 {
  if(i) printf(" ");
  printf("%d",unav[i]);
 }
 printf("/n");
 for(i=0;i<=split[0];i++)
 {
  if(i) printf(" ");
  printf("%d",split[i]);
 }
 printf("/n");
 return 0;
}