现在的位置: 首页 > 综合 > 正文

Poj 3660 Cow Contest (传递闭包 Floyd算法变形)

2014年01月23日 ⁄ 综合 ⁄ 共 723字 ⁄ 字号 评论关闭

题目链接:http://poj.org/problem?id=3660

题意:有n头牛比赛,m种比赛结果,最后问你一共有多少头牛的排名被确定了,其中如果a战胜b,b战胜c,则也可以说a战胜c,即可以传递胜负。求能确定排名的牛的数目。

思路:Floyd算法变形,关于传递闭包网上没有搜到能看懂的资料……不过大致可以理解是什么意思。感觉思路很巧妙。

解法完全参照了:http://www.cnblogs.com/pushing-my-way/archive/2012/08/23/2652153.html

#include <cstdio>
#include <cstring>

bool map[105][105];
int n,m;

void Floyd ()
{
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			for (int k=1;k<=n;k++)
				map[j][k]=map[j][k] || map[j][i] && map[i][k];
}

int main ()
{
	while (~scanf("%d%d",&n,&m))
	{
		memset(map,false,sizeof(map));
		while (m--)
		{
			int u,v;
			scanf("%d%d",&u,&v);
            map[u][v]=true;
		}
		Floyd ();
		int ans=0,cnt=0;
		for (int i=1;i<=n;i++)
		{
			cnt=0;
			for (int j=1;j<=n;j++)
				if (i==j) continue;
				else if (map[i][j] || map[j][i])
					cnt++;
			if (cnt==n-1)  //出度+入度=n-1;
				ans++;
		}
		printf("%d\n",ans);
	}
	return 0;
}

抱歉!评论已关闭.