专题四 第十二道题

1.题目编号:1008

2.简单题意:给出一个图,要求出最大的pseudoforest,它是指这个图的一个子图,这个子图的每个连通分量中最多只能有一个环,而且这个子图的所有权值之和最大,就是伪森林

3.解题思路形成过程:求最小生成树改成了求最大生成树

4.感悟:并查集问题。。

5.AC的代码:

#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
struct node{
    int u,v,c;
}Eg[100010];
 bool cmp(node a,node b){


        return a.c>b.c;
  }
int f[10010];
bool flag[10010];
int Find(int x){
   if(x!=f[x])
      f[x]=Find(f[x]);
   return f[x];
}
int main()
{
    int n,m;
    while(scanf("%d %d",&n,&m),n|m){
        int i,j,k;
        int u,v;
        for(i=0;i<m;i++)
          scanf("%d %d %d",&Eg[i].u,&Eg[i].v,&Eg[i].c);
        sort(Eg,Eg+m,cmp);
        int sum=0;
        for(i=0;i<n;i++) f[i]=i,flag[i]=false;
        for(i=0;i<m;i++){
          u=Eg[i].u;
          v=Eg[i].v;
          u=Find(u);
          v=Find(v);
          if(u!=v){
            if(!flag[u]&&!flag[v]){
                f[u]=v;
                sum+=Eg[i].c;
            }
            else if(!flag[u]||!flag[v]){
                f[u]=v;
                sum+=Eg[i].c;
                flag[u]=flag[v]=true;
            }
          }
          else{
            if(!flag[u]){
                flag[u]=true;
                sum+=Eg[i].c;
            }
          }
        }
        printf("%d\n",sum);
    }


    return 0;
}


你可能感兴趣的:(专题四 第十二道题)