题目链接
前面说到,李云龙集结了所有驻扎在外的部队,想要进攻平安县城,但是平安县城太大了,李云龙的部队太多了,把平安县城围起来之后自己传达命令很不方便,而且由于山本的手下有个狙击手专打通讯员,派遣通讯员很有可能发生意外使得命令传达不到,所以李云龙决定派工程兵修建电话线。由于这是一个危险的任务,而且为了尽快建好通讯电话网络,工程兵需要在最短的时间内建立一个能够传达命令的电话网络。
Input
多样例输入,且至少有一个可行方案。
每个样例的第一行有两个整数,P(需要建立通讯的部队数),R(部队与部队之间能够建立通讯电话的总数)。
接下来的R行输入路径,每行含3个整数,前两个数表示部队编号,最后一个数表示修建这条电话线所需要的时间
当P为0时输入结束。
P最大为50,每条电话线修建时间最多为100。
i和j之间的路径可以表示为 i j 或 j i
Output
对于每个样例,输出一个数表示建立完善的通讯电话网络所需要的最短时间
Sample Input
1 0
2 3
1 2 37
2 1 17
1 2 68
3 7
1 2 19
2 3 11
3 1 7
1 3 5
2 3 89
3 1 91
1 2 32
5 7
1 2 5
2 3 7
2 4 8
4 5 11
3 5 10
1 5 6
4 2 12
0
Sample Output
0
17
16
26
不会存在两条不同的线路链接同样的两个部队
题意思路:最小生成树模板题
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 51;
const int inf = 0x3f3f3f3f;
int mp[maxn][maxn],dis[maxn];
bool vis[maxn];
int p,r;
void prime()
{
int mi,v;
for(int i=1;i<=p;i++)
{
dis[i]=mp[1][i];
vis[i]=false;
}
for(int i=1;i<=p;i++)
{
mi=inf;
for(int j=1;j<=p;j++)
{
if(!vis[j]&&mi>dis[j])
{
mi=dis[j];
v=j;
}
}
vis[v]=true;
for(int j=1;j<=p;j++)
{
if(!vis[j]&&dis[j]>mp[v][j])
dis[j]=mp[v][j];
}
}
dis[0]=0;
for(int i=1;i<=p;i++)
dis[0]+=dis[i];
cout<<dis[0]<<endl;
}
int main()
{
int s,e,w;
while(cin>>p&&p!=0)
{
cin>>r;
//memset(mp,inf,sizeof(mp));
for(int i=1;i<=p;i++)
{
for(int j=1;j<=p;j++)
{
if(i==j)
mp[i][j]=0;
else
mp[i][j]=inf;
}
}
for(int i=0;i<r;i++)
{
cin>>s>>e>>w;
if(mp[s][e]>w)
mp[s][e]=mp[e][s]=w;
}
prime();
}
return 0;
}