• HDOJ 1863


    #include<stdio.h>
    #include<string.h>
    int father[105],depth[105];
    int dist[105],map[101][101];
    int vis[105],n;
    void init_B()
    {
        int i;
        for(i = 1;i <= n;i ++)
        {
            father[i] = i;
            depth[i] = 0;
        }
    }
    
    int find(int x)
    {
        if(x == father[x])
            return x;
        return father[x] = find(father[x]);
    }
    
    void unit(int x,int y)
    {
        x = find(x);
        y = find(y);
        if(x == y)
            return ;
        if(depth[x] < depth[y])
            father[x] = y;
        else
        {
            if(depth[x] > depth[y])
                father[y] = x;
            else
            {
                father[x] = y;
                depth[y]++;
            }
        }
    }
    
    void init()
    {
        int i;
        memset(vis,0,sizeof(vis));
        for(i = 1;i <= n;i ++)
            dist[i] = map[1][i];
    }
    
    int main()
    {
        int m,i,j,k,a,b;
        int min,cnt,cost,sum;
        while(~scanf("%d%d",&m,&n) && m)
        {
            init_B();
            sum = cnt = 0;
            for(i = 1;i <= n;i ++)
            {
                for(j = 1;j <= n;j ++)
                {
                    if(i != j)
                    {
                        map[i][j] = 1 << 30;
                    }
                }
            }
            while(m--)
            {
                scanf("%d%d%d",&a,&b,&cost);
                map[a][b] = map[b][a] = cost;
                unit(a,b);
            }
            init();
            for(i = 1;i <= n;i ++)
            {
                if(i == find(i))
                    cnt++;
                if(cnt == 2)
                    break ;
            }
            if(cnt == 2)
            {
                printf("?
    ");
                continue ;
            }
            for(i = 0;i < n;i ++)
            {
                min = 1 << 30;
                for(j = 1;j <= n;j ++)
                {
                    if(!vis[j] && min > dist[j])
                    {
                        min = dist[j];
                        k = j;
                    }
                }
                vis[k] = 1;
                if(min != 1 << 30)
                    sum += min;
                for(j = 1;j <= n;j ++)
                {
                    if(!vis[j] && dist[j] > map[k][j])
                        dist[j] = map[k][j];
                }
            }
            printf("%d
    ",sum);
        }
        return 0;
    }


  • 相关阅读:
    C#操作Word (2)-- 打开&关闭Word文档
    JS input 银行卡号格式转换
    解决H5在微信浏览器或QQ浏览器修改title的问题
    CSS
    Atom 编辑器使用和学习
    php的一个小坑,输出不了json_encode
    js 组合键监听ctrl + enter
    webpack3.0 环境搭建
    css 使表格随着内容自动适应宽度
    获取input光标的x和y轴
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3933256.html
Copyright © 2020-2023  润新知