您的位置:首页 > 其它

图算法6之1008

2016-07-06 09:50 218 查看
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 3
0 1 1
1 2 1
2 0 1
4 5
0 1 1
1 2 1
2 3 1
3 0 1
0 2 2
0 0

 

Sample Output

3
5

 

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
;

 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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: