传递闭包,三重循环,外面两层循环按照列优先来遍历,最内层循环按照行来遍历。
#include <stdio.h>
#include <cstring>int list[505][505];
int main()
{
int k;
int n, m, a, b;
scanf("%d", &k);
while(k--)
{
scanf("%d%d", &n, &m);
memset(list, 0, sizeof(list));
for(int i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
list[a][b] = 1;
}
//3重循环 ,传递闭包
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(list[j][i] == 1) //注意这里是list[j][i]而不是list[i][j]
for(int k = 1; k <= n; k++)
if(list[i][k] == 1)
list[j][k] = 1;
int res=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)
continue;
if(!list[i][j]&&!list[j][i])
res++;
}
res /= 2;
printf("%d\n", res);
}
return 0;
}
Rank HDU - 1704 (传递闭包。。)
最新推荐文章于 2021-07-25 18:40:42 发布