最小生成树—prime算法

来源:互联网 发布:苍老师最经典 知乎 编辑:程序博客网 时间:2024/06/05 19:44

问题 C:建立通信

时间限制1 Sec  内存限制128 MB
提交7  解决4
[
提交][状态][讨论版]

题目描述

据不完全统计,受地震影响,四川大部分灾区通信陷入瘫痪,数千个基站因断电、传输中断等原因退出服务,目前总公司已紧急部署对受灾地区进行通信抢修。按照应急通信保障预案,必须尽快、付出代价最小,效率更高来全力恢复通信。
由于四川大部分灾区都处于山区,有很多基站之间不能直接建立通信。现已知建立各基站之间直接通信的代价,问如何建立总代价最小的通信网,使得任意两个基站之间都能通信?

输入

1行: N (N为的个数 )
2~N+1行: Pi1 Pi2 ……PinPij为建立基站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 99999999int 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;}

0 0
原创粉丝点击