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*(n-1)/2-ans); 45 } 46 return 0; 47 }