传递闭包问题
#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]));
}
}
}
}
本文探讨了如何通过递归实现闭包问题的解决方法,包括初始化矩阵、更新矩阵值和输出结果等步骤。
428

被折叠的 条评论
为什么被折叠?



