图算法6之1008
来源:互联网 发布:毕业论文数据库 编辑:程序博客网 时间:2024/06/15 22:45
1 题目编号:1008
2 题目内容:
3 30 1 11 2 12 0 14 50 1 11 2 12 3 13 0 10 2 20 0
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;
}
- 图算法6之1008
- 算法导论之图算法
- 图之prim算法
- 图之kruskal算法
- 图之Dijkstra算法
- 数据结构算法之图
- 算法09 之图
- 图之Dijkstra算法
- 【图算法之二分图匈牙利算法】
- 图算法12之图算法总结
- 算法之图搜索算法(一)
- 算法之图搜索算法(一)
- 算法之图搜索算法(一)
- 算法导论之图的基本算法
- 图算法之最短路径算法
- 贪心算法4之1008
- 搜索算法2之1008
- 贪心算法6之1000
- mysql大批量数据迁移的坑
- HDU 3487 题解
- jquery基本选择器
- DOM事件
- 微信支付接入指南
- 图算法6之1008
- Java Web学习总结(20)——基于ZooKeeper的分布式session实现
- 一篇文章,掌握所有开源数据库的现状
- 通过ServiceManager统一管理aidl服务
- HDU 5293 Tree chain problem(树形DP+树链剖分)
- POJ2533/hdoj1950【DP】
- SearchView去掉下划线
- Android短信验证
- void QObject::moveToThread(QThread * targetThread)