Networking-POJ 1287(最小生成树)

题目链接
前面说到,李云龙集结了所有驻扎在外的部队,想要进攻平安县城,但是平安县城太大了,李云龙的部队太多了,把平安县城围起来之后自己传达命令很不方便,而且由于山本的手下有个狙击手专打通讯员,派遣通讯员很有可能发生意外使得命令传达不到,所以李云龙决定派工程兵修建电话线。由于这是一个危险的任务,而且为了尽快建好通讯电话网络,工程兵需要在最短的时间内建立一个能够传达命令的电话网络。

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;
}

发布了67 篇原创文章 · 获赞 2 · 访问量 1854

猜你喜欢

转载自blog.csdn.net/weixin_44641254/article/details/103972816