poj1251

来源:互联网 发布:java 中声明short定义 编辑:程序博客网 时间:2024/05/27 12:22

题意:给你几个点 ,然后下一行就是给你其中一个点 然后跟着一个值,这个值表示有几个点和这个点之间有路径可走,让你求最小生成树,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;

}



0 0
原创粉丝点击