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

来源:互联网 发布:淘宝店铺上新微淘描述 编辑:程序博客网 时间:2024/06/10 20:27

题目链接: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;}


原创粉丝点击