建立通信(最小生成树)

题目:

建立通信


题目描述

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

输入

第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


题目描述:

最小生成树模板题。这里用prim实现的。

代码:

#include<stdio.h>
#include<string.h>
const int maxn=1e3+5;
int map[maxn][maxn];
int dis[maxn],bk[maxn];
const int inf=200000000;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
         
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&map[i][j]);
                if(map[i][j]==-1)
                map[i][j]=inf;
            }
        }
         
        for(int i=1;i<=n;i++)
        {
            dis[i]=map[1][i];
        }
        int c=0,j;
        memset(bk,0,sizeof(bk));
        bk[1]=1;
        c++;
        int min,s=0;
        while(c<n)
        {
            min=inf;
            for(int i=1;i<=n;i++)
            {
                if(bk[i]==0&&dis[i]!=-1&&dis[i]<min)
                {
                    min=dis[i];
                    j=i;
                }
 
            }
            bk[j]=1;
            c++;
            s+=dis[j];  
            for(int k=1;k<=n;k++)
            {
                if(bk[k]==0&&map[j][k]!=-1&&dis[k]>map[j][k])
                dis[k]=map[j][k];
            }       
        }
        printf("%d\n",s);
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/hunt_er/article/details/80244473