题目:
建立通信
题目描述
据不完全统计,受地震影响,四川大部分灾区通信陷入瘫痪,数千个基站因断电、传输中断等原因退出服务,目前总公司已紧急部署对受灾地区进行通信抢修。按照应急通信保障预案,必须尽快、付出代价最小,效率更高来全力恢复通信。
由于四川大部分灾区都处于山区,有很多基站之间不能直接建立通信。现已知建立各基站之间直接通信的代价,问如何建立总代价最小的通信网,使得任意两个基站之间都能通信?
由于四川大部分灾区都处于山区,有很多基站之间不能直接建立通信。现已知建立各基站之间直接通信的代价,问如何建立总代价最小的通信网,使得任意两个基站之间都能通信?
输入
第1行: N (N为的个数 )
第2~N+1行: Pi1 Pi2 ……Pin (Pij为建立基站i与基站j直接通信的代价
i, j=1 , 2, …., 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
【约束条件】
(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;
}