Cow Contest

poj3660: http://poj.org/problem?id=3660 

题意:一些奶牛之间进行编程比赛,每头牛都有一个编程能力。如果a的能力比b的能力高,则a总能打败b 。现在给你一些牛之间的比赛,以及相应的赢家。让你求出已经确定名牛的个数。

题解:只要求出这头牛与其他n-1头之间的关系就行了。如果关系确定,则说明该牛确定。自然想到弗洛伊德求传递闭包。然后求出不能确定的牛的数量,然后总牛数减去即可。

#include<iostream> 
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int map[102][102];
int n,m,u,v,counts;
const int INF=100000000;
void Floyd(){
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i!=j&&i!=k&&k!=j&&map[i][k]+map[k][j]<map[i][j])
                  map[i][j]=map[i][k]+map[k][j];
            }
        }
    }
}
int main(){
    while(~scanf("%d%d",&n,&m)){
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
             map[i][j]=INF;
             }
        for(int i=1;i<=m;i++){
            scanf("%d%d",&u,&v);
            map[u][v]=1;
        }
        Floyd();
        counts=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i!=j&&map[i][j]>=INF&&map[j][i]>=INF)
                {counts++;
                break;}
            }
        }
        printf("%d\n",n-counts);
    }
}
View Code 

posted on 2013-10-03 10:05  天依蓝  阅读(147)  评论(0编辑  收藏  举报

导航