呵呵。。。。
这道题算法其实是典型的最小生成树算法,但还是用了不少时间,主要是这个输入让人很纠结啊!
/*
ID: guo geer
PROG: agrinet
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
/*
最小生成树
*/
int main()
{
ifstream fin("agrinet.in");
ofstream fout("agrinet.out");
int i,j,k,n;
int arc[100][100];
while(fin>>n)
{
fin.ignore();
int count = 0;
int digit = 0;
while(count<n*n)
{
char s[100];
fin.getline(s, 80);
int length = 0;
for(length = 0; s[length] != '\0'; length++);
//输入的字符串长度超过80,可能会导致换行。
if(length >= 80)
{
for(j=0; s[j] != '\0'; j++)
if(j == 0 && digit != 0 && s[j] != ' ')
{
digit = 10*digit + (s[j] - '0');
}
/*
.......... 12
34 ..........
这种情况1234为一个数
*/
else if(s[j] == ' ' && digit != 0)
{
arc[count/n][count%n] = digit;
digit = 0;
count ++;
}
/*
出现空格表示已读取了一个数;
读取0的情况特别考虑;
*/
else if(digit == 0 && s[j] == '0')
{
arc[count/n][count%n] = digit;
digit = 0;
count ++;
}
/*
读取的第一个字母为‘0’时,读取可以结束
0单独考虑是因为这种情况:
............0
此时可能整个输入已结束,避免下一次s重新读入一行。
*/
else digit = 10*digit + (s[j] - '0');
}
/*
长度不足80时
*/
else
{
for(j=0; s[j] != '\0'; j++)
if(j == 0 && digit != 0)
digit = 10*digit + (s[j] - '0');
else if(s[j] == ' ')
{
arc[count/n][count%n] = digit;
digit = 0;
count ++;
}
else digit = 10*digit + (s[j] - '0');
arc[count/n][count%n] = digit;
digit = 0;
count ++;
}
}
//最小生成树算法Prim
int lowcost[100], adjvex[100];
for(i=1; i<n; i++)
{
lowcost[i] = arc[i][0];
adjvex[i] = 0;
}
lowcost[0] = 0;
for(i=1; i<n; i++)
{
int Min = 1000000000;
for(j=0; j<n; j++)
if(lowcost[j] != 0 && Min > lowcost[j])
{
k = j;
Min = lowcost[j];
}
lowcost[k] = 0;
for(j=1; j<n; j++)
if(arc[k][j] < lowcost[j])
{
lowcost[j] = arc[k][j];
adjvex[j] = k;
}
}
int sum = 0;
for(i=1; i<n; i++)
{
sum += arc[i][adjvex[i]];
arc[i][adjvex[i]] = arc[adjvex[i]][i] = 0;
}
fout<<sum<<endl;
}
return 0;
}