**题目描述:**给出一个无向图,求出最小生成树,保证图是联通的
输入格式:
第一行包含两个整数 N,M。表示该图共有 N 个结点和 M 条无向边。
接下来 M 行,每行包含三个整数 X, Y ,Z
表示有一条长度为 Z 的无向边连接结点 X, Y
输出格式:
输出一个整数表示最小生成树的各边的长度之和
数据范围:
1<= n <= 1000
1<=m <= 1000000
(注:点的标号是从1开始的)
#include <bits/stdc++.h>
#define N 0x3f3f3f3f
using namespace std;
int m, n, x, y, w, edge[1010][1010], lowcost[1010], adj[1010], cnt = 0;
void prim(int u) {
for (int i = 1; i <= n; i++) {
lowcost[i] = edge[u][i];
adj[i] = u;
}
adj[u] = -1;
for (int i = 1; i <= n; i++) {
if (i != u) {
int smt = N, v = 1;
for (int j = 1; j <= n; j++)
if (adj[j] != -1 && lowcost[j] < smt) {
v = j;
smt = lowcost[j];
}
if (v != 1) {
adj[v] = -1;
cnt += lowcost[v];
for (int j = 1; j <= n; j++)
if (adj[j] != -1 && edge[v][j] < lowcost[j]) {
lowcost[j] = edge[v][j];
adj[j] = v;
}
}
}
}
}
int main()
{
cin >> n >> m;
memset(edge, N, sizeof(edge));
for (int i = 1; i <= n; i++) {
edge[i][i] = 0;
}
while (m--) {
cin >> x >> y >> w;
edge[x][y] = w;
}
prim(1);
cout << cnt << endl;
return 0;
}