传递闭包问题
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define MAXN 101
#define INF 10001
int iNum,iPair;
int iT[MAXN][MAXN];
void transitiveClosure();
int main()
{
int i,j;
int A,B;
int tmp,ans;
scanf("%d%d",&iNum,&iPair);
for(i=1;i<=iNum;i++)
{
for(j=1;j<=iNum;j++)
{
if(i==j)
{
iT[i][j]=1;
continue;
}
iT[i][j]=0;
}
}
for(i=1;i<=iPair;i++)
{
scanf("%d%d",&A,&B);
iT[A][B]=1;
}
transitiveClosure();
ans=0;
for(i=1;i<=iNum;++i)
{
tmp=0;
for(j=1;j<=iNum;++j)
{
if(iT[i][j]||iT[j][i]) ++tmp;
}
if(tmp==iNum) ++ans;
}
printf("%d\n",ans);
return 0;
}
void transitiveClosure()
{
int i,j,k;
for(k=1;k<=iNum;k++)
{
for(i=1;i<=iNum;i++)
{
for(j=1;j<=iNum;j++)
{
iT[i][j]=(iT[i][j]||(iT[i][k]
&&iT[k][j]));
}
}
}
}