http://acm.nyist.net/JudgeOnline/problem.php?pid=211&&有向图传递闭包问题

来源:互联网 发布:multisim mac版 编辑:程序博客网 时间:2024/06/11 21:39

这一题是有向图的传递闭包问题,,,而这提的要求就是输出有多少牛可以确定名次的。算法思想:求出每个牛的出度和入度之和看是否等于n-1(n为牛的个数),我这里是用floyd算法写的,,,

#include<iostream>#include<algorithm>#include<string.h>#include<cstdio>#define N 105#define FOR(i,s,t) for(int i=(s);i<=(t);++i)using namespace std;bool map[N][N];int n,m;void floyd(){    FOR(k,1,n)      FOR(i,1,n)       FOR(j,1,n)        if((map[i][k]&&map[k][j])||map[i][j])           map[i][j]=true; } int main() {    while(~scanf("%d%d",&n,&m)!=EOF&&n&&m)      { FOR(i,1,n)初始化工作        FOR(j,1,n)         if(i==j) map[i][j]=true;          else   map[i][j]= false;           FOR(i,1,m)           { int a,b;             scanf("%d%d",&a,&b);             map[a][b]=true;                        }            floyd();           int ans=0;           FOR(i,1,n)            { int sum=0;               FOR(j,1,n)                if(i==j) continue;                 else{  if(map[i][j]||map[j][i]) sum++;                         if(sum==n-1) ans++;                      }            }            printf("%d\n",ans);       } return 0;     }


 

原创粉丝点击