Section 5.3 Network of Schools

/*
ID: niepeng1
PROG: schlnet
LANG: C++
*/
/*
 额,没有写出来,直接看例程。
 这个对后继的判定存储很巧。其实我还是有点晕。
*/
#include <stdio.h>
#include <memory.h>

struct node{
 int st;
 int et;
}sta[100],temp[100];
int i,j,n,t,a[100][100],blo[100],res[100][2],innum,outnum;
bool yet[100],rela[100][100];
void dfs(int x)
{
 int i;
 t++;
 sta[x].st=t;
 yet[x]=true;
 for(i=1;i<=a[x][0];i++)
  if(yet[a[x][i]]==false)
   dfs(a[x][i]);
 t++;
 sta[x].et=t;
}
int main()
{
 freopen("schlnet.in","r",stdin);
 freopen("schlnet.out","w",stdout);
 memset(rela,false,sizeof(rela));
 scanf("%d",&n);
 for(i=0;i<n;i++)
 {
  a[i][0]=0;
  while(scanf("%d",&t)&&t)
  {
   a[i][++a[i][0]]=t-1;
   rela[i][t-1]=true;
  } 
 }
 memset(yet,false,sizeof(yet));
 memset(sta,0,sizeof(sta));
 t=0;
 for(i=0;i<n;i++) if(!yet[i])  dfs(i);
 memcpy(temp,sta,sizeof(sta));
 memset(a,0,sizeof(a));
 for(i=0;i<n;i++)
  for(j=n-1;j>=0;j--)
   if(rela[i][j]) a[j][++a[j][0]]=i;
 memset(yet,false,sizeof(yet));
 t=0;
 for(i=0;i<n;i++) if(!yet[i])  dfs(i);
 memset(yet,false,sizeof(yet));
 memset(blo,-1,sizeof(blo));
 t=-1;
 for(i=0;i<n;i++)
  if(!yet[i])
  {
   t++;
   blo[i]=t;
   yet[j]=true;
   for(j=0;j<n;j++)
    if(!yet[j]&&temp[j].st>temp[i].st&&temp[j].et<temp[i].et&&
     sta[j].st>sta[i].st&&sta[j].et<sta[i].et)
    {
     blo[j]=t;
     yet[j]=true;
    }
  }
 if(!t)
 {
  printf("1/n0/n");
  return 0;
 }
 memset(res,0,sizeof(res));
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
   if(rela[i][j]&&blo[j]!=blo[i])
   {
    res[blo[i]][1]++;
    res[blo[j]][0]++;
   }
 innum=outnum=0;
 for(i=0;i<=t;i++)
 {
  if(!res[i][0]) innum++;
  if(!res[i][1]) outnum++;
 }
 printf("%d/n",innum);
 if(outnum>innum) printf("%d/n",outnum);
 else printf("%d/n",innum);
 return 0;

}a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值