poj  3660 Cow Contest

来源:互联网 发布:ubuntu root登陆ssh 编辑:程序博客网 时间:2024/06/02 00:06

解题思路:这道题是一道关于floyd的图论题。题目的意思是说有n头牛比赛,m种比赛结果,最后问你一共有多少头牛的排名被确定了,其中如果a战胜b,b战胜c,则也可以说a战胜c,即可以传递胜负。 这个题目考察的就是传递关系,类似于离散数学中的传递闭包。如果一头牛与所有别的牛的比赛结果都确定,就是说这头牛的位置是确定的用floyd来求出传递闭包。然后判断,输出。

代码:

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;

const intMAX=105;
const int INF=0xffffff;
int n,m,map[MAX][MAX];

voidFloyd()
{
    inti,j,k;
   for(i=1;i<=n;i++)
   {

       for(j=1;j<=n;j++)
       {
           for(k=1;k<=n;k++)
           {
               if(map[j][i]==1&&map[i][k]==1)
               {
                   map[j][k]=1;
                   map[k][j]=-1;
               }
               elseif(map[j][i]==-1&&map[i][k]==-1)
               {
                   map[j][k]=-1;
                   map[k][j]=1;
               }
           }
       }
    }
}

voidPrin()
{
    inti,j,ans=0;
   for(i=1;i<=n;i++)
    {
       bool flag=true;
       for(j=1;j<=n;j++)
       {

           if(i==j)
           continue;
           if(map[i][j]!=1&&map[i][j]!=-1)
           {
               flag=false;
               break;
           }
       }
       if(flag)
           ++ans;
    }
   cout<<ans<<endl;
}

intmain()
{
    inti,j,a,b;
   cin>>n>>m;
   for(i=0;i<=n;i++)
   {

       for(j=i+1;j<=n;j++)
       map[i][j]=map[j][i]=INF;
       map[i][i]=0;
    }
   for(i=1;i<=m;i++)
   {

      // 1表示打败,-1表示被打败 
        cin>>a>>b;
        map[a][b]=1;
        map[b][a]=-1;
    }
    Floyd();
    Prin();
    return 0;


}

网上另一种解法:【算法分析】如果A赢了B,那么连边[A,B],然后传递闭包。最后,如果某只牛的出度+入度=n-1的话,它的排名就已经确定了。

利用出度入度,其实我感觉解法差不多,我的解法只是没有直接体现出度入度

代码:代码好短啊!!!!

#include <iostream>
using namespace std;
int f[101][101],n,m;

 

int main(){
    cin>> n >>m;
    for (inti=1;i<=m;i++){
       int x,y;
       cin >> x>> y;
       f[x][y]=1;
    }
    for (intk=1;k<=n;k++)   
     for (int i=1;i<=n;i++)
       for (int j=1;j<=n;j++)
         if (f[i][k]+f[k][j]==2)
           f[i][j]=1;
    intans=0;
    for (inti=1;i<=n;i++){
       int total=0;
       for (int j=1;j<=n;j++)
         if (f[i][j] || f[j][i]) total++;
       if (total==n-1) ans++;
     
    cout<< ans<< endl;
}

 

 

原创粉丝点击