题目:
一个无向图,顶点为N个,其中M条边已给定,求使得整个图连通,且选出的边权值和最小。
输入
4 4
1 2 2
1 4 1
2 3 3
3 4 4输出
6
第一行的两个数据分别为N顶点个数和边M的个数;下面的M行为每条边的数据,
起始点和终点,还有每条边的权值。
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 10010,INF=99999999;
int G[maxn][maxn];
int d[maxn];
bool visit[maxn] = { false };
int n,sum = 0;
int prim(int index) {
fill(d, d + maxn, INF);
d[index] = 0;
for (int i = 1; i <= n; i++) {
int u = -1, mind = INF;
for (int j = 1; j <= n; j++) {
if (visit[j] == false && d[j] < mind) { //从未被访问的点中找到距离值最小的
u = j;
mind = d[j];
}
}
if (u == -1) return -1;
visit[u] = true;
sum += d[u];
for (int v = 1; v <= n; v++) {
if (visit[v] == false && G[u][v]!=INF && G[u][v] < d[v]) //G[u][v]!=INF不要丢
d[v] = G[u][v];
}
}
return sum;
}
int main() {
int m,a,b,x;
cin >> n >> m;
fill(G[0], G[0] + maxn*maxn, INF); //二维数组使用fill赋初值
for (int i = 0; i < m; i++) {
cin >> a >> b >> x;
G[a][b] = G[b][a] = x; //无向图记得双向赋值!
}
cout << prim(1);
system("pause");
return 0;
}