POJ 3660题
//解题思路:这道题是一道关于floyd的图论题。题目的意思是说有n头牛比赛,m种比赛结果,最后问你一共有多少头牛的排名被确定了,其中如果a战胜b,b战胜c,则也可以说a战胜c,即可以传递胜负。
//这样如果一头牛的被x头牛打败,打败y头牛,且x+y=n-1,则我们容易知道这头牛的排名就被确定了,所以我们只要将任何两头牛的胜负关系确定了,在遍历所有牛判断一下是否满足x+y=n-1,将满足这个条件的牛数目加起来就是所求解。
//抽象为简单的floyd算法,在加上每个顶点的出度与入度 (出度+入度=顶点数-1,则能够确定其编号)
#include <stdio.h>
#include <string.h>
#define arraysize 101
int map[arraysize][arraysize];
int main()
{
//freopen("1.txt","r",stdin);
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(map,0,sizeof(map));
int a,b;
for(int i=0;i<m;++i)
{
scanf("%d%d",&a,&b);
map[a][b] = 1;
}
//确定传递闭包
for(int i1=1;i1<n+1;++i1)
{
for(int i2=1;i2<n+1;++i2)
{
for(int i3=1;i3<n+1;++i3)
{
if(map[i2][i1] == 1 && map[i1][i3]==1)
{
map[i2][i3] = 1;
}
}
}
}
int ans = 0;
for(int i4=1;i4<n+1;++i4)
{
int temp = 0;
for(int j=1;j<n+1;++j)
{
//不计算本身的环
if(i4 == j)
continue;
//计算该节点出度和入度的总和
else if(map[i4][j] == 1 || map[j][i4] ==1)
{
temp++;
}
}
if(temp == n-1)
ans++;
}
printf("%d\n",ans);
}
return 0;
}
浙公网安备 33010602011771号