POJ 3660 Cow Contest (floyd变形)

题意:

有n(1<=n<=100)个学生参加编程比赛。

给出m条实力信息。(1<=M<=4500)

其中每一条的格式为 A B (1<=A<=N,1<=B<=N,A!=B) 意思是A的实力比B强。

如果A比B强且B比C强,那么A一定比C强。

问最后有多少名学生可以确定他的排名。

保证输入信息不存在矛盾

思路:

初始化有联系的点得边为1,用floyd把有间接联系的点的边(邻接矩阵)赋值为1,最后扫一遍图统计每个点有联系的点的总数,如果等于n-1,则cnt++。

#include<iostream>
#include<cstring>
using namespace std;
int e[105][105];
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        memset(e,0,sizeof(e));
        for(int i=0;i<m;i++)
        {
            int a,b;
            cin>>a>>b;
            e[a][b]=1;
        }
        for(int k=1;k<=n;k++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(e[i][k]&&e[k][j])
                    {
                        e[i][j]=1;

                    }
                }
            }
        }
        int flag=0,cnt=0,t1[105]={0};
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(e[i][j])
                {
                    t1[i]++,t1[j]++;
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            if(t1[i]==n-1)
            {
                 cnt++;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Dilly__dally/article/details/84349926