#include <iostream> #include <algorithm> #include <memory.h> using namespace std; #define N 10005 #define INF 1000000000 int a[N][N]; bool vis[N]; int dis[N]; int ans; int n; bool Prim() { memset(vis, 0, sizeof(vis)); for (int i = 1; i <= n; i++) { dis[i] = INF; } ans = 0; dis[1] = 0; for (int i = 1; i <= n; i++) { int tmp = INF; int k = 0; for (int j = 1; j <= n; j++) { if (vis[j]) continue; if (tmp > dis[j]) { tmp = dis[j]; k = j; } } vis[k] = true; if (tmp == INF) return false; ans += tmp; for (int j = 1; j <= n; j++) { if (vis[j]) continue; if (dis[j] > a[k][j]) { dis[j] = a[k][j]; } } } return true; } int main() { while (cin >> n) { if (n == -1) break; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) cin >> a[i][j]; } Prim(); cout << ans << endl; } return 0; }
原文:http://blog.csdn.net/dutsoft/article/details/23210597