poj1251

题意:给你几个点 ,然后下一行就是给你其中一个点 然后跟着一个值,这个值表示有几个点和这个点之间有路径可走,让你求最小生成树,prime算法,就是输入的时候有一些麻烦,是字符ABCD之类的 我们要把字符先转换成整形再去做,字符串操作中很多我也喜欢这么做

#include<cstdio>

#include<cstring>

#include<cmath>

#include<vector>

#include<queue>

#include<iostream>

#include<algorithm>

#define maxn 0x3f3f3f3f


using namespace std;


int n,m1,m2;

char a1[10],a2[2];

int map[30][30],d[30];

bool vis[30];

void prime()

{

    for(int i = 0; i < n; i ++)

    {

        d[i] = map[0][i];

        vis[i] = 0;

    }

    for(int i = 0; i < n; i ++)

    {

         int minx = maxn;

         int now;

        for(int j = 0; j < n; j ++)

        {

            if(!vis[j] && minx > d[j])

            {

                now = j;

                minx = d[j];

            }

        }

        vis[now] = 1;

        for(int k = 0; k < n; k ++)

        {

            if(!vis[k] && d[k] > map[now][k])

                d[k] = map[now][k];

        }

    }

    for(int i = 1; i < n; i ++)

        d[0] += d[i];

    printf("%d\n",d[0]);

}


int main()

{

    while(~scanf("%d",&n)&&n)

    {

        for(int i = 0; i < n; i ++)

            for(int j = 0; j < n; j ++)

        {

            if(i == j)

                map[i][j] = 0;

            else map[i][j] = maxn;


        }

        for(int i = 1; i < n; i ++)

        {

            scanf("%s%d",a1,&m1);

            for(int j = 0; j < m1; j ++)

            {

                scanf("%s%d",a2,&m2);

                map[a1[0]- 'A'][a2[0] - 'A'] = map[a2[0]- 'A'][a1[0] - 'A'] = m2;

            }

        }

        prime();

    }


    return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值