1. 程式人生 > >POJ 3660 Cow Contest (floyd變形)

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;
}