最基本的最小生成树,可以用Prim和Kruskal
Prim算法的解答,参考http://blog.csdn.net/niushuai666/article/details/6689295
/*
ID: wangxin12
PROG: agrinet
LANG: C++
*/
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
using namespace std;
#define MAX 100
long map[MAX + 1][MAX + 1];
long lowcost[MAX + 1];
bool visited[MAX + 1];
int nodeNum, sum = 0;
void prim();
int main() {
ifstream fin("agrinet.in");
ofstream fout("agrinet.out");
int i, j;
//read data
fin>>nodeNum;
for(i = 1; i <= nodeNum; i++) {
for(j = 1; j <= nodeNum; j++) {
fin>>map[i][j];
}
}
//body prim
prim();
fout<<sum<<endl;
return 0;
}
void prim() {
long temp, k;
int i, j; //循环用
//init,选择prim开始的node,此处选1
visited[1] = true;
for(i = 1; i <= nodeNum; i++) {
lowcost[i] = map[1][i];
}
//
for(i = 1; i <= nodeNum; i++) {
temp = 999999999;
for(j = 1; j <= nodeNum; j++) {
if( !visited[j] && temp > lowcost[j]) {
temp = lowcost[j];
k = j;
}
}
if(temp == 999999999)
break;
visited[k] = true;
sum += lowcost[k];
for(int t = 1; t <= nodeNum; t++) {
if( !visited[t] && lowcost[t] > map[k][t])
lowcost[t] = map[k][t];
}
}
}