Kruskal算法
prim算法链接
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std ;
#define MAX 100
#define INF 0x3f3f3f3f
struct Road
{
int a, b;
int w;
}road[MAX];
struct Vex{
int x;
int y;
}vex[MAX];
bool cmp(Road a, Road b){
return a.w < b.w;
}
int N, E, k = 0 ;
int v[MAX];
int getRoot(int a)
{
while (a != v[a])
a = v[a];
return a;
}
void unionn(int r1, int r2){
v[r2] = r1;
}
void Kruskal(int &sum, Road road[], Vex vex[])
{
int i, a, b;
sum = 0 ;
for (i = 0 ; i < N; i++)
{
v[i] = i;
}
sort(road, road + E, cmp);
for (i = 0 ; i < E; ++i)
{
a = getRoot(road[i].a);
b = getRoot(road[i].b);
if (a != b)
{
unionn(a, b);
vex[k].x = road[i].a;
vex[k].y = road[i].b;
k++;
sum += road[i].w;
}
}
}
int main() {
int x, y, w;
cin >> E >> N;
for (int i = 0 ; i < E; i++)
{
cin >> x >> y >> w;
road[i].a = x;
road[i].b = y;
road[i].w = w;
}
int sum = 0 ;
Kruskal(sum, road, vex);
for (int i = 0 ; i < k; i++)
{
cout << vex[i].x << " " << vex[i].y << endl;
}
cout << sum << endl;
return 0 ;
}