poj 3275(传递闭包)

题目链接:http://poj.org/problem?id=3275

思路:对于n个节点,共有n*(n-1)/2对关系,对于给出的m对已经确定的关系,我们可以用传递闭包推出目前已经确定的关系对数ans,于是答案就是n*(n-1)/2-ans.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 #define MAXN 1010
 8 
 9 vector<vector<int> >G_from;
10 vector<vector<int> >G_to;
11 bool map[MAXN][MAXN];
12 
13 int main()
14 {
15     int n,m,u,v,ans;
16     while(~scanf("%d%d",&n,&m)){
17         G_from.clear();G_from.resize(n+2);
18         G_to.clear();G_to.resize(n+2);
19         memset(map,false,sizeof(map));
20         while(m--){
21             scanf("%d%d",&u,&v);
22             map[u][v]=true;
23             G_from[v].push_back(u);
24             G_to[u].push_back(v);
25         }
26         ans=0;
27         for(int k=1;k<=n;k++){
28             for(int i=0;i<G_from[k].size();i++){
29                 for(int j=0;j<G_to[k].size();j++){
30                     u=G_from[k][i],v=G_to[k][j];
31                     if(!map[u][v]){
32                         map[u][v]=true;
33                         G_from[v].push_back(u);
34                         G_to[u].push_back(v);
35                     }
36                 }
37             }
38         }
39         for(int i=1;i<=n;i++){
40             for(int j=1;j<=n;j++)if(i!=j){
41                 if(map[i][j])ans++;
42             }
43         }
44         printf("%d
",n*(n-1)/2-ans);
45     }
46     return 0;
47 }
View Code
原文地址:https://www.cnblogs.com/wally/p/3280033.html