题目:Minimum Spanning Tree SPOJ - MST
题意:n个结点,m条边,然后依次给出这m条边的首结点,尾结点,及边长。求连接所有结点的边长最小和为多少。
思路:基本的最小生成树问题,用Kruskal算法解决(注意,结果要用long long储存,不然会gg)
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<math.h>
#include<vector>
#include<string>
#include<map>
#include<queue>
#include<algorithm>
#include<string.h>
using namespace std;
/*最小生成树*/
int node_check[10086];
struct my_node
{
int first_node;
int end_node;
int weight;
};
bool cmp(my_node a,my_node b)
{
if (a.weight<b.weight)
{
return true;
}
else
{
return false;
}
}
int tree_find(int x)
{
if (node_check[x]==x)
{
return x;
}
else
{
return tree_find(node_check[x]);
}
}
int main()
{
for (int i = 0; i < 10086; i++)
{
node_check[i] = i;
}
int node, edge;
cin >> node >> edge;
vector<my_node>test;
for (int i = 0; i < edge; i++)
{
my_node temp;
cin >> temp.first_node >> temp.end_node >> temp.weight;
test.push_back(temp);
}
sort(test.begin(),test.end(), cmp);
long long my_result = 0;
int flag = 0;
for (int i = 0; i < edge; i++)
{
int first_root = tree_find(node_check[test[i].first_node]);
int end_root = tree_find(node_check[test[i].end_node]);
if (first_root!=end_root)
{
my_result += test[i].weight;
flag++;
node_check[end_root] = node_check[first_root];
if (flag == (node - 1))
{
break;
}
}
}
cout << my_result << endl;
}