图论之闭包传递

闭包传递(floyed)

Cow Contest

题目大意:
有N头牛,编号从1到N,参与一个编程比赛( 大牛编程比赛0.0 ),一些牛的代码比较出色,每头牛都有一个独一无二的技能等级在这些竞争者中。
如果牛A的等级比牛B高,那么牛A永远能击败牛B。约翰试图排列牛的必杀技等级,给你M条比赛结果,来判断这些牛的等级,保证没有矛盾的结果。

思路:
将n头牛想象成n个点,将题目中给的m个关系想象成单向的路,最后判断是否可达就可以了.


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
# define maxn 100+10
# define inf 0x3f3f3f3  f
int a[maxn][maxn];
int main()
{
    ios::sync_with_stdio(false);
    int n,m;
    while(cin>>n>>m)
    {
        memset(a,0,sizeof(a));
        for(int i=1; i<=m; i++)
        {
            int u,v;
            cin>>u>>v;
            a[v][u]=1;
        }
        int ans=0;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                for(int k=1; k<=n; k++)
                {
                    if(a[j][i]&&a[i][k])///如果j能击败i,i能击败k那么j就能击败k。
                    {
                        a[j][k]=1;
                    }
                }
            }
        }
        for(int i=1;i<=n;i++){
        int sum=0;
        for(int j=1;j<=n;j++){
        if(i==j)continue;
        sum+=a[i][j]+a[j][i];
        }
        if(sum==n-1)ans++;
        }
        cout<

你可能感兴趣的:(图论)