• 【POJ】[1251]Jungle Roads


    这里写图片描述

    知道是最小生成树
    都懒得再一句一句翻译题目了……

    由题目描述
    这里用Prim更好一些
    因为村庄数比较少
    ……吐槽一下
    现在见多了
    英语还真是好多了
    扫一下还真能差不多看懂

    这里使用数组然后字符减’A’的形式直接来储存

    另外这里的输入数据涉及到字符 空格 换行什么的 有点坑……
    嗯……应该说很坑……
    算法一点没问题……卡在输入数据动弹不得……
    舍本逐末嘛!

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int main() {
        int dis[27];
        int e[27][27];
        bool flag[27];
        int N,inf=999999;
        while(scanf("%d",&N),N) {
            getchar();
            for(int i=1; i<=N; i++) {
                dis[i]=inf;
                flag[i]=false;
            }
            for(int i=1; i<=N; i++) {
                for(int j=1; j<=N; j++) {
                    e[i][j]=inf;
                }
            }
            for(int i=1; i<N; i++) {
                char c;
                int n;
                scanf(" %c %d",&c,&n);
                while(n--) {
                    char c2;
                    int t2;
                    scanf(" %c %d",&c2,&t2);
                    e[c-'A'+1][c2-'A'+1]=t2;
                    e[c2-'A'+1][c-'A'+1]=t2;
                }
            }
            /*
            这种输入方法POJ会超时……
            不过杭电可以过 
                    for(int i=1; i<N; i++) {
                        char c;
                        int n;
                        scanf("%c %d",&c,&n);
                        while(n--) {
                            char c2;
                            int t2;
                            getchar();
                            scanf("%c %d",&c2,&t2);
                            e[c-'A'+1][c2-'A'+1]=t2;
                            e[c2-'A'+1][c-'A'+1]=t2;
                        }
                        getchar();
                    }
            */
            int sum=0;
            dis[1]=0;
            while(true) {
                int v=-1;
                for(int u=1; u<=N; u++) {
                    if(!flag[u]&&(v==-1||dis[u]<dis[v]))
                        v=u;
                }
                if(v==-1)
                    break;
                flag[v]=true;
                sum+=dis[v];
                for(int u=1; u<=N; u++) {
                    dis[u]=min(dis[u],e[v][u]);
                }
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    

    题目地址:
    【POJ】[1251]Jungle Roads
    【杭电】[1301]Jungle Roads

  • 相关阅读:
    进度条
    radio checkbox 修改默认样式
    css3实现的switch开关按钮
    CSS常用样式
    js定义对象的多个属性值
    jquey常用代码
    分享一个酷炫动态登录页面html
    博客园添加背景音乐,背景效果!
    几个有益的 CSS 小知识
    html+css-->background-img(背景图的设置)
  • 原文地址:https://www.cnblogs.com/BoilTask/p/12569774.html
Copyright © 2020-2023  润新知