hdu 1704 传递闭包

//题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1704
//题意描述:给你一些胜负关系,问最后有多少组人无法知道胜负关系。
//思路: 将已经有胜负关系的用一条有向边连在一起,即将题目转换为求任何图的传递闭包,若2个人之间没有胜负关系,则他们之间不存在边

 

#include <iostream> using namespace std; const int MAXN = 500+10; int map[MAXN][MAXN]; int main() { int t; int n,m; int a,b; int i,j,k; cin>>t; while(t--) { cin>>n>>m; memset(map,0,sizeof(map)); while(m--) { cin>>a>>b; map[a][b] = 1; } for(i=1; i<=n; i++) { for(j=1; j<=n; j++) { if(map[i][j]) { for(k=1; k<=n; k++) { if(map[k][i]) { map[k][j] = 1; } } } } } int cnt = 0; for(i=1; i<=n; i++) { for(j=i+1; j<=n; j++) { if(map[i][j] == 0 && map[j][i] == 0) //询问i,j 与询问 j,i是一样。图为有向图,所以只要i,j或j,i其中一个能判断出胜负即可 { cnt++; } } } cout<<cnt<<endl; } return 0; }

你可能感兴趣的:(hdu 1704 传递闭包)