POJ 3660 Cow Contest (Floyd求传递闭包)

来源:互联网 发布:qq视频变声软件 编辑:程序博客网 时间:2024/04/24 07:39

传送门:http://poj.org/problem?id=3660

题目大意:n(<=100)头奶牛,每两头之间有一个能力大小关系,表示能否战胜,战胜关系可以传递,问可以确定多少头牛的排名。

解题思路:关系可以传递,则可以借助Floyd求出两两之间的关系,然后对于每一头判断能否与之确定关系的牛数是否等于n-1(不包含自己),是的话,答案数加1。

Code:

/*   W          w           w        mm          mm             222222222       7777777777777    *//*    W        w w         w        m  m        m  m          222        22              7777    *//*    w        w w         w        m  m        m  m                     22              777     *//*     w      w   w       w        m    m      m    m                    22              77      *//*     w      w    w      w        m    m      m    m                 222                77      *//*      w    w      w    w        m      m    m      m              222                  77      *//*      w    w      w    w        m      m    m      m            222                    77      *//*       w  w        w  w        m        m  m        m         222                      77      *//*       w  w        w  w        m        m  m        m      222                         77      *//*        ww          ww        m          mm          m     222222222222222             77      *///#pragma comment(linker, "/STACK:102400000,102400000")//C++//int size = 256 << 20; // 256MB//char *p = (char*)malloc(size) + size;//__asm__("movl %0, %%esp\n" :: "r"(p));//G++#include<set>#include<map>#include<queue>#include<stack>#include<ctime>#include<deque>#include<cmath>#include<vector>#include<string>#include<cctype>#include<cstdio>#include<cstdlib>#include<cstring>#include<sstream>#include<iostream>#include<algorithm>#define REP(i,s,t) for(int i=(s);i<=(t);i++)#define REP2(i,t,s) for(int i=(t);i>=s;i--)using namespace std;typedef long long ll;typedef unsigned long long ull;typedef unsigned long ul;const int MAXN=105;const int MAXM=4505;int n,m;bool d[MAXN][MAXN];int main(){    #ifdef ONLINE_JUDGE    #else        freopen("test.in","r",stdin);    #endif    while(~scanf("%d%d",&n,&m))    {        memset(d,false,sizeof(d));        REP(i,1,m)        {            int u,v;            scanf("%d%d",&u,&v);            d[u][v]=true;        }        REP(k,1,n)        {            REP(i,1,n)            {                REP(j,1,n)                {                    if(d[i][k]&&d[k][j])                    {                        d[i][j]=true;                    }                }            }        }        int ans=0;        REP(i,1,n)        {            int cnt=0;            REP(j,1,n)            {                if(i==j)                {                    continue;                }                if(d[i][j])                {                    cnt++;                }                if(d[j][i])                {                    cnt++;                }            }            if(cnt==n-1)            {                ans++;            }        }        printf("%d\n",ans);    }    return 0;}
0 0