Jungle Roads-POJ 1251(最小生成树)

题目链接

有一个旅游区,旅游区有很多的景点,景点间需要开通缆车,使得任意两个景点可以互相到达。现在给出一些点间的缆车线路制造成本,两个景点之间可能有多重制造方式。问最少的花费是多少。

Input
输入包括多组数据,最多100组,最后以输入0表示结束。
对于每一组数据,第一行一个n,表示景区数量。1<n<27
之后n-1行,每行第一个是一个大写字母,表示当前景区的编号,接着是k,表示当前景区对外可以有k中缆车线路制造方式,接着k对,每对第一个是一个字母,表示这条路线连接的景区,第二个是一个数字,表示制造成本。0<=k<=15。最多75条制造线路,每条线路的制造成本最大是100。

Output
对于每一组数据,输出一行表示最小成本。

Sample Input
9
A 2 B 12 I 25
B 3 C 10 H 40 I 8
C 2 D 18 G 55
D 1 E 44
E 2 F 60 G 38
F 0
G 1 H 35
H 1 I 35
3
A 2 B 10 C 40
B 1 C 20
0

Sample Output
216
30
题意思路:最小生成树模板题。
代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 28;
const int inf = 0x3f3f3f3f;
int road[maxn][maxn],dis[maxn];
bool vis[maxn];
int n;
void prime()
{
    int mi,v;
    for(int i=0;i<n;i++)
    {
        dis[i]=road[0][i];
        vis[i]=false;
    }
    for(int i=1;i<=n;i++)
    {
        mi=inf;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&mi>dis[j])
            {
                mi=dis[j];
                v=j;
            }
        }
        vis[v]=true;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&dis[j]>road[v][j])
                dis[j]=road[v][j];
        }
    }
    for(int i=1;i<n;i++)
        dis[0]+=dis[i];
    cout<<dis[0]<<endl;
}
int main()
{
    int k,w;
    char s[5],e[5];
    while(cin>>n&&n!=0)
    {
        memset(road,inf,sizeof(road));
        for(int i=0;i<n;i++)
        {
            road[i][i]=0;
        }
        for(int i=1;i<n;i++)
        {
            scanf("%s%d",s,&k);
            for(int j=0;j<k;j++)
            {
                scanf("%s%d",e,&w);
                road[s[0]-'A'][e[0]-'A']=road[e[0]-'A'][s[0]-'A']=w;
            }
        }
        prime();
    }
    return 0;
}

感悟:模板题要多敲。

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

猜你喜欢

转载自blog.csdn.net/weixin_44641254/article/details/103963117
今日推荐