(精)(图论加强)传递闭包

来源:互联网 发布:c语言extern的作用 编辑:程序博客网 时间:2024/05/22 15:05
/*题目:n头牛进行m场比赛,问能确定排名的有多少头牛。  解答:构造一个n个点的有向图,如果牛a胜b,那么a->b,如果a->b,b->c,则有a->c,这个用floyd。  最后得到该图的传递闭包link的二维数组。最后统计每一个点入度和出度和为n-1的点的个数即可。*/#include<stdio.h>#include<string.h>const int MAX=105;/*有向图的传递闭包!注意传递之前一定要初始化!如果i!=j&&(i,j)不属于E(边的集合) t[i][j]=0;如果i=j||(i,j)属于E(边的集合)     t[i][j]=1;*///传递闭包void Transitive_Closure(int n,bool t[][MAX]){int i,j,k;for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)t[i][j]=t[i][j]|(t[i][k]&t[k][j]);}int main(){int n,i,j,m,st,ed,sum,num;bool t[MAX][MAX];while(scanf("%d%d",&n,&m)){if(n==0&&m==0)return 0;memset(t,false,sizeof(t));for(i=1;i<=n;i++)t[i][i]=true;for(i=1;i<=m;i++){scanf("%d%d",&st,&ed);t[st][ed]=true;}//上面的代码都是初始化Transitive_Closure(n,t);sum=0;for(i=1;i<=n;i++){num=0;for(j=1;j<=n;j++)if(i==j)continue;elsenum+=(t[i][j]||t[j][i]);//统计出度和入度的个数!sum+=(num==n-1);}printf("%d\n",sum);}return 0;}/*5 54 34 23 21 22 5  2*/

原创粉丝点击