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