最小生成树Fruskal算法(并查集优化)

现共有n个住户,这些住户之间有m条道路,现在有一个邮差需要从一号住户出发往每个用户家里送一份当天的报纸,为了尽快送达每家每户,现在你需要帮邮差算一算他最少需要走多远?
输入第一行n,m
接下来m行,每行三个整数,第一个整数表示此条道路的出发住户编号,第二个整数表示到达的住户编号,第三个整数表示此条道路的长度
输出一个整数表示最少需要走的长度,输出占一行

样例输入:
6 9
2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2
样例输出:

19

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
    int x;
    int y;
    int w;
}que1[1002];
int n,m;//n代表n个顶点,m代表m个边
int book[1002];
void quicksort(int l,int r)
{
    int i=l,j=r;
    struct node t;
    if(l>r)
        return ;
    while(i!=j)
    {
        while(que1[j].w>que1[l].w&&i<j)
            j--;
        while(que1[i].w<que1[l].w&&i<j)
            i++;
        if(i<j){
            t=que1[i];
            que1[i]=que1[j];
            que1[j]=t;
        }
    }
    t=que1[i];
    que1[i]=que1[l];
    que1[l]=t;
    quicksort(l,i-1);
    quicksort(i+1,r);
    return ;
}
int getf(int i)
{
    if(book[i]==i)
        return i;
    else {
        book[i]=getf(book[i]);
        return book[i];
    }
}
int merge1(int u,int v)
{
    int t1=getf(u);
    int t2=getf(v);
    if(t1==t2)
        return 0;
    else{
        book[t2]=t1;
        return 1;
    }
}
int main()
{
    int count1=0,sum=0;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>que1[i].x>>que1[i].y>>que1[i].w;
    }
    quicksort(1,m);
    for(int i=1;i<=n;i++)
        book[i]=i;
    for(int i=1;i<=m;i++)
    {
        if(merge1(que1[i].x,que1[i].y)){
            count1++;
            sum+=que1[i].w;
        }
        if(count1==n-1)break;
    }
    cout<<sum<<endl;
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_40788630/article/details/80190182