#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int n,m;
struct edge{
int u;
int v;
int w;
friend bool operator<(const edge& e1,const edge& e2)
{
return e1.w<e2.w;
}
};
void makeset(vector<int>&pre)
{
pre.assign(n,0);
for(int i = 0; i< n;i++)
pre[i] = i;
}
int find(vector<int>&pre ,int x)
{
while(pre[x] != x)
x = pre[x];
return x;
}
void kruskal(const vector<edge>& edges)
{
vector<int>pre;
vector<edge>ST;
int cost = 0;
int fu,fv;
makeset(pre);
for(int i = 0; i <edges.size();i++)
{
fu = find(pre,edges[i].u);
fv = find(pre,edges[i].v);
if(fu!=fv)
{
ST.push_back(edges[i]);
cost+=edges[i].w;
pre[fu]=fv;
}
}
}
int main()
{
cin>>n>>m;
vector<edge>edges;
edges.assign(m,edge());
for(int i = 0; i < m ;i++)
cin>>edges[i].u>>edges[i].v>>edges[i].w;
sort(edges.begin(),edges.end());
kruskal(edges);
return 0;
}
最小生成树 kruskal算法
最新推荐文章于 2021-11-23 15:20:24 发布