最小生成树(kruskal算法)

来源:互联网 发布:libjpeg.so.62 ubuntu 编辑:程序博客网 时间:2024/06/07 20:54
#include <cstdio>#include <iostream>#include <queue>#include <vector>#include <cstring>#include <algorithm>#include <string>#include <map>#include <set>using namespace std;int n,m;const int maxn = 1e5;int f[maxn];struct node{    int x;int y;int d;}tmp[maxn];int cmp(node a,node b){    return a.d < b.d;}int getf(int x){    if(f[x] == x) return x;    else  return (f[x] = getf(f[x]));}int mix(int x,int y){    int t1 = getf(x);    int t2 = getf(y);    if(t1 != t2)    {        f[t1] = t2;        return 1;    }    return 0;}int main(){    cin >> n >> m;    for(int i = 0;i <= n;i++)        f[i] = i;    for(int i = 0;i < m;i++)        cin >> tmp[i].x >> tmp[i].y >> tmp[i].d;    sort(tmp,tmp+m,cmp);    long long sum = 0;    for(int i = 0;i < m;i++)///算法的核心部分    {        if(mix(tmp[i].x,tmp[i].y))            sum += tmp[i].d;    }    cout << sum << endl;    return 0;}/**6 92 4 113 5 134 6 35 6 42 3 64 5 71 2 13 4 91 3 2**/

算法的核心部分其实还可以优化,就是当边检验到n-1的时候,就已经成了一棵树了,就不需要继续进行判断的,可以省下一部分判断的时间

long long sum = 0; int cnt  = 0;    for(int i = 0;i < m;i++)    {        if(mix(tmp[i].x,tmp[i].y))            sum += tmp[i].d,cnt++;            if(cnt == n-1)                break;    }