基础最短路 八 POJ3660

来源:互联网 发布:yy淘宝互刷平台 编辑:程序博客网 时间:2024/05/25 16:37


POJ 3660 :http://poj.org/problem?id=3660

n为 100

这题起初没想出来,看了网上的人的想法。愧疚愧疚......


题目大意:n只牛,m场比赛。表示 牛A打败了牛B。

问:有几只牛的排名能够确定。


看了网上大家的解答,明白。一只牛的排名要想确定,必须知道 这只牛和 其他n-1只牛 的胜败关系。

而胜败关系是可以传递的。也就是说,牛A打败了牛B,牛B打败了牛C,那么牛A肯定打败牛C。

所以这题就是要求 n只牛之间的传递闭包。 然后统计有哪些牛 和别的n-1只牛皆有胜败关系。没那么这只牛的排名就确定了。


求传递闭包,用Floyd算法。   我还以为时间复杂度这么高的算法没什么用呢..........O__O "…


Floyd:

#include"cstdio"#include"iostream"#include"cstring"#include"algorithm"#include"vector"#include"cmath"#include"queue"using namespace std;#define INF 9999999#define inf 109#define loop(x,y,z) for(x=y;x<z;x++)#define ll long longint main(){    int n,m;    int e[inf][inf];    int i,j,k;    int ans=0;    memset(e,0,sizeof e);    scanf("%d%d",&n,&m);    while(m--)    {        scanf("%d%d",&i,&j);        e[i][j]=1;    }    loop(k,1,n+1)        loop(i,1,n+1)            loop(j,1,n+1)            if(e[i][k]&&e[k][j])                e[i][j]=1;    loop(i,1,n+1)    {        int sum=0;        loop(j,1,n+1)        if(e[j][i])sum++;        loop(j,1,n+1)        if(e[i][j])sum++;        if(sum==n-1)ans++;    }    printf("%d\n",ans);    return 0;}


0 0
原创粉丝点击