您的位置:首页 > 其它

hihocoder1098最小生成树(kruscal算法)

2015-02-22 21:46 190 查看
kruscal算法描述:

kruscal算法的思路是:最初,把所有节点都看成孤立的集合,将图中所有的边按权重从小到大排序,然后依次遍历这些边,若边的两个端点在两个不同的集合中,则合并这条边的端点所属的两个集合,直到选出n-1条边将图中的所有n个节点都合并到了同一个集合,n-1次合并就选出了n-1条边,由这n-1条边和图上的n哥节点所构成的就是我们需要的该图的最小生成树。

kruscal算法的性能依赖于边的数目,故对于稀疏图的最小生成树问题,采用kruscal算法比较优越。

我的代码:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

#define MAXN 100005
#define INF 0x7fffffff

struct edge
{
int u, v, w;
edge(int _u, int _v, int _w):u(_u),v(_v),w(_w){}
bool operator<(const edge &x)const
{
return w<x.w;
}
};

vector<edge> e;
int n, m;

struct unionFindSet
{
int st[MAXN];
void init()
{
for(int i=1; i<=n; ++i) st[i] = i;
}
int findSet(int x)
{
if(x==st[x]) return x;
return st[x] = findSet(st[x]);
}
void unionSet(int x, int y)
{
int sx = findSet(x), sy = findSet(y);
st[sx] = sy;
}
}ufs;

int kruscal()
{
sort(e.begin(), e.end());
int ans = 0, cnt = 0;
ufs.init();
for(int i=0; i<e.size()&&cnt<n-1; ++i)
{
int su = ufs.findSet(e[i].u), sv = ufs.findSet(e[i].v);
if(su!=sv)
{
ufs.unionSet(su, sv);
ans += e[i].w;
}
}
return ans;
}

int main()
{
while(cin>>n>>m)
{
e.clear();
while(m--)
{
int u, v, w;
cin>>u>>v>>w;
e.push_back(edge(u, v, w));
}
cout<<kruscal()<<endl;
}
return 0;
}


题目链接:http://hihocoder.com/problemset/problem/1098
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: