图算法6之1008

来源:互联网 发布:毕业论文数据库 编辑:程序博客网 时间:2024/06/15 22:45

1 题目编号:1008

2 题目内容:

Problem Description
In graph theory, a pseudoforest is an undirected graph in which every connected component has at most one cycle. The maximal pseudoforests of G are the pseudoforest subgraphs of G that are not contained within any larger pseudoforest of G. A pesudoforest is larger than another if and only if the total value of the edges is greater than another one’s.<br><br>
 

Input
The input consists of multiple test cases. The first line of each test case contains two integers, n(0 < n <= 10000), m(0 <= m <= 100000), which are the number of the vertexes and the number of the edges. The next m lines, each line consists of three integers, u, v, c, which means there is an edge with value c (0 < c <= 10000) between u and v. You can assume that there are no loop and no multiple edges.<br>The last test case is followed by a line containing two zeros, which means the end of the input.<br>
 

Output
Output the sum of the value of the edges of the maximum pesudoforest.<br>
 

Sample Input
3 30 1 11 2 12 0 14 50 1 11 2 12 3 13 0 10 2 20 0
 

Sample Output
35
 

3 解题思路形成过程:每输入一条边,判断此边两端点是不是在同一颗树上,如果在同一颗树上,判断树是不是有环,如果有环,则不加入此边,如果没环,加入此边(合并);如果两棵树都没有环,直接合并即可,如果只有一棵树有环,可以合并,并标记,如果都有环,显然不能合并

4 代码:

#include<iostream>
using namespace std;
#define M 100005
#define N 10005
struct node
{
 int x,y;
 int len;
}g[M];
int cmp(const void *a,const void *b)
{
 return (*(node *)b).len - (*(node *)a).len;
}
int father[M],n;
int cha(int x)
{
    if(x==father[x])
        return x;
    father[x]=cha(father[x]);
    return father[x];
}
int bing(int x,int y)
{
    father[cha(x)]=cha(y);
    return 0;
}
int main()
{
    int k,x,y,z,m,i,ans;
    int used[N];
 while(scanf("%d%d",&n,&m)&&(m||n))
    {
        for(i=0;i<m;i++)
        {
   scanf("%d%d%d",&g[i].x,&g[i].y,&g[i].len);
        }
        for(i=0;i<=n;i++)
            father[i]=i;
        k=0;
      //  int max=0;
        ans=0;
        qsort(g,m,sizeof(g[0]),cmp);
  memset(used,0,sizeof(used));
        for(i=0;i<m;i++)
        {
   x=g[i].x;
   y=g[i].y;
            z=g[i].len;
   int ca=cha(x);
   int cb=cha(y);
            if(ca!=cb)
            {
    if(used[ca]==0 || used[cb] ==0)
    {
     ans+=z;
     if(used[cb] == 1)
      bing(x,y);
     else
      bing(y,x);
    }
            }
   else if(used[ca]==0)
   {
    used[ca] = 1;
    ans+=z;
   }
        }
        cout<<ans<<endl;
    }
    return 0;
}

1 0
原创粉丝点击