2016SDAU课程练习四1008 Problem H
来源:互联网 发布:2017观潮网络空间论坛 编辑:程序博客网 时间:2024/06/06 14:11
Problem H
Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65536/65536K (Java/Other)
Total Submission(s) : 81 Accepted Submission(s) : 41
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
题意:
求一个图的最大连通子图,连通分量最多只可以形成一个环。在输入中给出顶点的个数、边的个数,要求编写一个程序实现所求边的权值最大。
解题思路:
采用并查集处理回路的问题,判断是否有环,并且考虑三种合并并查集的情况,和之前的问题一样。
求一个图的最大连通子图,连通分量最多只可以形成一个环。在输入中给出顶点的个数、边的个数,要求编写一个程序实现所求边的权值最大。
解题思路:
采用并查集处理回路的问题,判断是否有环,并且考虑三种合并并查集的情况,和之前的问题一样。
#include<stdio.h>
#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;
//这里注意把环作为祖先,因为find
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( scanf("%d%d",&n,&m)==2,n||m ){
//if( n==0&&m==0 ) break;
for( int i=0;i<m;i++ )
scanf("%d%d%d",&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;
}
printf("%d\n",ans);
}
return 0;
}
#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;
//这里注意把环作为祖先,因为find
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( scanf("%d%d",&n,&m)==2,n||m ){
//if( n==0&&m==0 ) break;
for( int i=0;i<m;i++ )
scanf("%d%d%d",&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;
}
printf("%d\n",ans);
}
return 0;
}
0 0
- 2016SDAU课程练习四1008 Problem H
- 2016SDAU课程练习四1001 Problem A
- 2016SDAU课程练习四1002 Problem B
- 2016SDAU课程练习四1003 Problem C
- 2016SDAU课程练习四1004 Problem D
- 2016SDAU课程练习四1005 Problem E
- 2016SDAU课程练习四1006 Problem F
- 2016SDAU课程练习四1009 Problem I
- 2016SDAU课程练习四1011 Problem K
- 2016SDAU课程练习四1023 Problem W
- 2016SDAU课程练习一1008 Problem I
- 2016SDAU课程练习一Problem G
- 2016SDAU课程练习一Problem E
- 2016SDAU课程练习一Problem Q
- 2016sdau课程练习专题四 1003
- 2016sdau课程练习专题四 1001
- 2016sdau课程练习专题四 1002
- 2016sdau课程练习专题四 1006
- poj 1062 dijkstra求最短路变形
- linux中替换所有文件名称和文件内容特定字符命令
- 在windows下运行Hadoop程序的环境配置
- 微信公众帐号开发教程第17篇-应用实例之智能翻译
- Android之LoadMoreListView
- 2016SDAU课程练习四1008 Problem H
- iOS开发-第一个App
- C#桌面办公应用-工资管理系统系列六
- Android开源特效最全合集
- 微信公众帐号开发教程第18篇-应用实例之音乐搜索
- 2016SDAU课程练习四1009 Problem I
- Golang的包依赖管理 (package dependency manager)
- Holistically-Nested Edge Detection
- nginx静态代理配置