题目一堆废话,直接看输入输出:
输入
在一组测试数据中:
第1行为1个整数N,表示小Hi拥有的城市数量。
接下来的N行,为一个N*N的矩阵A,描述任意两座城市之间建造道路所需要的费用,其中第i行第j个数为Aij,表示第i座城市和第j座城市之间建造道路所需要的费用。 N<=10^3
输出
对于每组测试数据,输出1个整数Ans,表示为了使任意两座城市都可以通过所建造的道路互相到达至少需要的建造费用。
Sample Input
5
0 1005 6963 392 1182
1005 0 1599 4213 1451
6963 1599 0 9780 2789
392 4213 9780 0 5236
1182 1451 2789 5236 0
Sample Output
4178
分析:在输入的时候改变一下,就是最小生成树的模板题。
#include<stdio.h>
int m,n,count=0,sum=0,e[110][110],dis[110],book[110] = {0};
int inf = 99999999;
void Prim()
{
int i,j,k,min;
for(i = 1; i <= n; i ++)
dis[i] = e[1][i];
book[1] = 1;
count ++;
while(count < n)
{
min = inf;
for(i = 1; i <= n; i ++)
if(book[i] == 0 && dis[i] < min)
{
min = dis[i];
j = i;
}
book[j] = 1;
count ++;
sum += dis[j];
for(k = 1; k <= n; k ++)
if(book[k] == 0 && dis[k] > e[j][k])
dis[k] = e[j][k];
}
}
int main()
{
int i,j,t1,t2,t3;
while(scanf("%d",&n) != EOF)
{
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
if(i == j)
e[i][j] = 0;
else
e[i][j] = inf;
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
scanf("%d",&e[i][j]);
Prim();
printf("%d\n",sum);
}
return 0;
}