您的位置:首页 > 其它

hdu 1704 Rank

2014-08-26 18:22 323 查看
题目链接:点击打开链接

题意:对于n个选手给出m场比赛的结果,结果有传递性,问有多少对选手不能判断他们之间的胜负关系

用a[i][j]表示i是否胜过j

把所有结果输入后用一个三重循环更新每两个选手间是否有胜负关系。全部更新完后枚举记录结果,再把结果除2即可。

三重循环中和最短路的floyd一样,要把中间点放在最外层循环,否则会wa。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
bool a[505][505];
int main(){
    int T;
    cin>>T;
    while(T--){
        memset(a,0,sizeof(a));
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            int s,t;
            scanf("%d%d",&s,&t);
            a[s][t]=1;
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(a[j][i]){
                    for(int k=1;k<=n;k++){
                        if(a[i][k])
                          a[j][k]=1;
                    }
                }
            }
        }
        int res=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i==j)continue;
                if(!a[i][j]&&!a[j][i]){
                    res++;
                }
            }
        }
        res/=2;
        printf("%d\n",res);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: