您的位置:首页 > 其它

poj3660 Cow Contest

2016-07-22 11:53 225 查看
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
int m,n,i,j,k,a,b,ans;
int e[110][110];
while(~scanf("%d%d",&n,&m))
{
memset(e,0,sizeof(e));
for(i=1; i<=m; i++)
{
scanf("%d%d",&a,&b);
e[a][b]=1;
}
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
if(e[i][k]==1&&e[k][j]==1)//如果i赢k,k赢j,则i赢j
e[i][j]=1;
}
int count=0;
for(i=1;i<=n;i++)
{
ans=0;
for(j=1;j<=n;j++)
{
if(e[i][j])//顶点i的出度
ans++;
if(e[j][i])顶点i的入度
ans++;
}
if(ans==n-1)
count++;
}
printf("%d\n",count);
}
}


题意大致为,给你N头牛,他们之间进行进行M场比赛来确定排名,如果A赢B,B赢C,相应的可以确定A赢C;问最后可以确定排名的牛共几头;
可以用Floyd算法来解决,利用一个中间变量k,用e[i][j]来表示i与j之间的比赛结果,若i与j之间有比赛,则e[i][j]=1;制作一个有向图,若i赢j,则顶点i指向顶点j有一条路;

最后求出每个顶点的出度和入度之和,看是否等于n-1,若等,则可以确定此牛的排名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: