标签:
解题思路:给出n个选手,m场比赛,问不能判断胜负的询问最多有多少种
用传递闭包即可 但是如果直接用3重循环会超时 在判断d[i][j]=d[i][k]||d[k][j]是否连通的时候 可以加一个if语句判断一下d[i][k]是否为1,为1再进行第三重循环,不为1则不进行第三次循环
反思:例如询问 3和1,1和3是相同的情况,所以最后判断的时候,只需要判断上三角矩阵即可。
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1134 Accepted Submission(s): 429
#include<stdio.h> #include<string.h> int d[505][505],a[505][505]; int main() { int ncase,n,m,i,j,k,sum,x,y; scanf("%d",&ncase); while(ncase--) { memset(d,0,sizeof(d)); sum=0; scanf("%d %d",&n,&m); while(m--) { scanf("%d %d",&x,&y); d[x][y]=1; } for(k=1;k<=n;k++) for(i=1;i<=n;i++) { if(d[i][k]) for(j=1;j<=n;j++) d[i][j]=d[i][j]||(d[k][j]); } for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) if(!(d[i][j]||d[j][i])) sum++; printf("%d\n",sum); } }
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4214465.html