问题 C: 建立通信
时间限制: 1 Sec 内存限制: 128 MB
提交: 7 解决: 4
[提交][状态][讨论版]
题目描述
据不完全统计,受地震影响,四川大部分灾区通信陷入瘫痪,数千个基站因断电、传输中断等原因退出服务,目前总公司已紧急部署对受灾地区进行通信抢修。按照应急通信保障预案,必须尽快、付出代价最小,效率更高来全力恢复通信。
由于四川大部分灾区都处于山区,有很多基站之间不能直接建立通信。现已知建立各基站之间直接通信的代价,问如何建立总代价最小的通信网,使得任意两个基站之间都能通信?
输入
第1行: N (N为的个数 )
第2~N+1行: Pi1 Pi2 ……Pin (Pij为建立基站i与基站j直接通信的代价
i, j=1 , 2, …., N )
输出
T (建立通信网的最小代价数)
【约束条件】
(1) 10 ≤ N ≤1000
(2) -1 ≤ Pij ≤ 1000 Pij 为整数,若Pij = -1,表示基站i与基站j不能直接通信
(3)时间限制: 1000MS
样例输入
5
0 160 30 20 -1
160 0 200 -1 -1
30 200 0 50 80
20 -1 50 0 70
-1 -1 80 70 0
样例输出
280
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 1001
#define Inf 99999999
int e[N][N], book[N], dis[N];
int main()
{
int i, j, k, n, m, count, sum, Min;
while(scanf("%d", &n)!=EOF)
{
count =0;
sum=0;
memset(book, 0, sizeof(book));
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
scanf("%d", &e[i][j]);
if(e[i][j]==-1)
e[i][j]=Inf;
}
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];
}
}
printf("%d\n", sum);
}
return 0;
}