专题四1008

来源:互联网 发布:程序员兼职的平台 编辑:程序博客网 时间:2024/05/19 23:27

题意:找到一个这样的图,在这个图中,最多有一个环。使得所有的边的和最大

解题思路:

贪心+并查集。首先把边排序,然后开始分类讨论。对于边ab(含有两个端点ab)如果a,b是属于两个不同的集合 , a b 是两个环中的点,则放弃aba b 有一个是环,则把环当做另一个的祖先,之后在回溯祖先的时候,能找到该点是在某个环中。

感想:要考试了,心好累啊。。。

AC源码:

#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int maxn = 10005;
const int maxm = 100005;
     struct node{
         int u,v,val;
     }edge[ maxm ];
     int fa[ maxn ],circle[ maxn ];

     int find( int x ){

         if( fa[x]==x ) return x;

         fa[x] = find(fa[x]);

         return fa[x];

     }

     bool union_ab( int x,int y ){

         int fax = find(x);

         int fay = find(y);

         if( fax==fay ){

             if( circle[ fax ]==-1 ){

                 circle[ fax ] = 1;

                 return true;

             }

             return false;
         }

         else{

             if( circle[ fax ]==circle[ fay ]&&circle[ fax ]==1 )

                 return false;

             if( circle[ fax ]==1 )

                 fa[ fay ] = fax;

             else

                 fa[ fax ] = fay;

             return true;

         }

     }

     void init( int n ){

         for( int i=0;i<n;i++ ){

             fa[i] = i;

             circle[ i ] = -1;

         }

     }

     int cmp( node a,node b ){

         return a.val>b.val;

     }

     int main(){

         int n,m;

         while( cin>>n>>m &&(n||m)){

             for( int i=0;i<m;i++ )

                 cin>>edge[i].u>>edge[i].v>>edge[i].val;

             init( n );

             sort( edge,edge+m,cmp );

             int ans = 0;

             for( int i=0;i<m;i++ ){

                 if( union_ab( edge[i].u,edge[i].v) )

                     ans += edge[i].val;

             }

            cout<<ans<<endl;

         }

         return 0;

     }




Problem H

Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other)
Total Submission(s) : 39   Accepted Submission(s) : 15
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
 

Statistic |Submit | Back

0 0
原创粉丝点击