POJ 3660 Cow Contest floyd传递闭包
http://poj.org/problem?id=3660
题意:N头牛进行比赛,问有几头牛可以确定次序
读完题立马想到拓扑排序,写出来WA了N久,最后查的解题报告是传递闭包,某头牛前面和后面的牛加起来等于n-1时,则该牛的次序确定,这个思路还是lmy想出来的,就是搞数学的啊,理性思维
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define nMAX 102
using namespace std;
int map[nMAX][nMAX],in[nMAX],out[nMAX];
int n;
void floyd()
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(map[i][j])continue;
if(map[i][k]&&map[k][j])
{
map[i][j]=1;
out[i]++;//出度
in[j]++;//入度
}
}
}
int main()
{
int m,i,j;
while(~scanf("%d%d",&n,&m))
{
memset(map,0,sizeof(map));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
while(m--)
{
scanf("%d%d",&i,&j);
map[i][j]=1;
out[i]++;
in[j]++;
}
floyd();
int ans=0;
for(i=1;i<=n;i++)
if(in[i]+out[i]==n-1)ans++;
printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号