思路:最小生成树,prim算法解.
/*
ID: xpli1
PROG: agrinet
LANG: C
*/
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define INT_MAX 0x7fffffff
#define IN stdin
#define OUT stdout
int weight[101][101];
int distance[101];
int source[101];
int intree[101];
int N,treesize,treecost;
void prim()
{
int i,j,k;
for(i=0; i<N; i++){
distance[i] = INT_MAX;
source[i] = -1;
intree[i] = 0;
}
treesize = 1;
treecost = 0;
intree[0] = 1;
for(i=1; i<N; i++){
distance[i] = weight[0][i];
source[i] = 0;
}
while(treesize < N){
int MIN = INT_MAX;
for(j=0; j<N; j++){
if(!intree[j] && MIN > distance[j]){
k = j;
MIN = distance[k];
}
}
treesize++;
treecost += distance[k];
intree[k] = 1;
for(j=0; j<N; j++){
if(!intree[j] && distance[j] > weight[k][j]){
distance[j] = weight[k][j];
source[j] = k;
}
}
}
return;
}
int main(void)
{
FILE* fin = fopen("agrinet.in","r");
FILE* fout = fopen("agrinet.out","w");
fscanf(IN,"%d",&N);
int i=0;
while(i<N*N) {fscanf(IN,"%d",&weight[i/N][i%N]); i++;}
prim();
fprintf(OUT,"%d/n",treecost);
return 0;
}