poj 3660 Cow Contest


// 题意: 有N只牛,M场比赛的结果,(a,b)代表奶牛a能战胜奶牛b,问有多少只奶牛的排名可以确定
// 思路: floyd算法的变形,给出一些点之间的大小关系,问有多少点的次序是固定的
#include <iostream> // floyd算法
using namespace std;
#define maxn 102
int distF[maxn][maxn];
// distF[a][b]= 1 表示a>b, 2 表示a<b ,0 表示 a,b的大小不确定
int n,m,i,j;
void floyd() //求出每对顶点之间的大小关系
{
for(int k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
//如果a>b且b>c,则有a>c;同样,若a<b且b<c,则a<c
if(distF[i][k]!=0&&distF[i][k]==distF[k][j])
{
distF[i][j]=distF[i][k];
}
}
}
}
}
int main()
{
int a,b;
cin>>n>>m;
fill(&distF[1][1],&distF[n+1][n+1],0); //表示任两点间的大小关系都不确定
while(m--)
{
cin>>a>>b; //a>b
distF[a][b]=1;
distF[b][a]=2;
}
floyd();
int ans=0;
for(i=1;i<=n;i++)
{
int num=0;
for(j=1;j<=n;j++)
{
if(distF[i][j]!=0) //i与j的大小关系确定
num++;
}
if(num==n-1) //若某一点与其他所有点的大小关系都已确定,那该点的次序必是固定的
ans++;
}
cout<<ans<<endl;
return 0;
}

#include
<iostream>//floyd,给出一些点之间的限制条件,问有多少点的次序是固定的
usingnamespace std;
#define maxn 102
int n,m,edge[maxn][maxn],distF[maxn][maxn],i,j;
void floyd() //求出每对顶点之间的大小关系
{
int k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
distF[i][j]
=edge[i][j];
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(distF[i][k]!=0&&distF[i][k]==distF[k][j]) //如果a>b且b>c,则有a>c;同样,若a<b且b<c,则a<c
{
distF[i][j]
=distF[i][k];
}
}
}
int main()
{
int a,b;
cin
>>n>>m;
memset(edge,
0,sizeof(edge)); //表示任两点间的大小关系都不确定
while(m--)
{
cin
>>a>>b;
edge[a][b]
=1; // 1 表示a>b, 2 表示a<b ,0 表示 a,b的大小不确定
edge[b][a]=2;
}
floyd();
int res=0;
for(i=1;i<=n;i++)
{
int s=0;
for(j=1;j<=n;j++)
if(distF[i][j]>0)
s
++;
if(s==n-1) //说明该点与其他所有点的大小关系都已确定,所以该点的次序必是固定的
res++;
}
cout
<<res<<endl;
return0;
}

  

posted on 2011-07-22 23:08  sysu_mjc  阅读(128)  评论(0编辑  收藏  举报

导航