Poj3660(floyd)

题目传送门

题意:编号为1-N的奶牛参加比赛,告诉我们m场比赛结果试问有几头奶牛的排名可以确定。

题解:其实就是一个传递闭包的模板题,用Floyd把所有有联系的比赛结果串在一起。

Ac 代码:

#include<bits/stdc++.h>
using  namespace std;
const int maxn=1e2+5;
int rp[maxn][maxn]; //rp[i][j]=1表示编号为i的奶牛战胜编号为j的奶牛;
int n,m,u,v;
void floyd()
{
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(rp[i][k]&&rp[k][j])  //求传递闭包;
                {
                    rp[i][j]=1;
                }
            }
        }
    }
    // 可以打印处理过的rp数组帮助理解;
   /* for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cout<<rp[i][j]<<" ";
        }
        cout<<endl;
    }*/
    int ans=0,j;
    for(int i=1;i<=n;i++)
    {
        for( j=1;j<=n;j++)
        {   
            if(i==j) continue;
            if(rp[i][j]==0&&rp[j][i]==0) break;  
        }
        if(j>n) ans++;  
    }
    printf("%d
",ans);
}
int main()
{
    scanf("%d%d",&n,&m);
    memset(rp,0,sizeof rp);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        rp[u][v]=1;
    }
    floyd();
    return 0;
}

原文地址:https://www.cnblogs.com/zpj61/p/13435923.html