专题四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
3 30 1 11 2 12 0 14 50 1 11 2 12 3 13 0 10 2 20 0
35
- 专题四1008
- 专题四1008
- 专题四 · 1008
- 1008-H专题四
- 杭电专题四1008
- 3G专题四
- LDAP专题(四)
- 专题四1003
- 专题四1003
- 专题四 · 1001
- 专题四 Problem A
- 专题四 Problem B
- 专题四 Problem C
- 专题四 Problem D
- 专题四 Problem E
- 专题四1001
- 专题四1005
- 专题四1004
- 在 iOS 应用中直接跳转到 AppStore 的方法
- 泛型
- Junittest
- 崩溃统计分析
- ScrollView 嵌套 ViewPager,ViewPager内容不显示问题
- 专题四1008
- 分享基于Live555开发的 H264视频直播流媒体项目
- django 模板语法
- 利用xml获取土豆网的[无广告]的视频地址
- react 的 bind this 几种方法
- 转载:用Hadoop,还是不用Hadoop?(使用Hadoop的场景)
- LeetCode:Valid Perfect Square
- 开源GIS浅谈
- php 导入excel 方法