zoukankan      html  css  js  c++  java
  • hdu 1875 畅通工程再续(prim方法求得最小生成树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1875

    /************************************************************************/
    /*     
            hdu  畅通工程再续
            有条件的最小生成树
            题目大意:在这些小岛中建设最小花费的桥,但是一座桥的距离必须在10 -- 1000之间。
    */
    /************************************************************************/
    
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <math.h>
    
    #define MAX 0xfffffff
    
    const int N = 101;
    
    typedef struct
    {
        int x,y;
    }POINT;
    
    POINT p[N];
    double map[N][N];
    int vis[N];
    int T,C,x,y,i,j;
    
    double get_distance(POINT a,POINT b)
    {
        return sqrt(pow(a.x-b.x,2.0)+pow(a.y-b.y,2.0));
    }
    
    void build_map()
    {
        double len;
        for (int t = 0; t < C; t++)
        for (int v = t; v < C; v++)
        {
            len = get_distance(p[t],p[v]);
            if(len>=10 &&len <= 1000)
            map[t][v] = map[v][t] = (t==v)?0:len;
            else map[t][v] = map[v][t] = MAX;
        }
        
    }
    
    void prim()
    {
        int k,t = C;
        double min,sum = 0;
        memset(vis,0,sizeof(vis));
        vis[0]=1;
        while(--t)
        {
            min = MAX;
            for (i = 1; i < C; i++)
            {
                if (vis[i]!=1 && map[0][i] < min)
                {
                    min = map[0][i];
                    k = i;
                }
            }
            if (min==MAX)break;
            vis[k] = 1;
            sum += min;
            for (i = 1; i < C; i++)
            {
                if (vis[i]!=1 && map[k][i] < map[0][i] )
                map[0][i] = map[k][i];
            }
        }
        //printf("%d
    ",t);
        if(t==0)
        {
            printf("%.1f
    ",sum*100);
        }else printf("oh!
    ");
    }
    
    
    int main()
    {
        while(scanf("%d",&T)!= EOF)
        {
            for (int t = 0; t < T; t++)
            {
                scanf("%d",&C);
                for (int c = 0; c < C; c++)
                scanf("%d%d",&p[c].x,&p[c].y);
                build_map();
                prim();
            }
            
        }
        return 0;
    }
  • 相关阅读:
    kakfa 入门
    Spring Boot maven构建——阿里云Maven仓库地址
    MongoDB入门一
    MongoDB入门
    mybatis 一对一、一对多、多对一、多对多
    springboot集成druid数据源并且监控
    java 过滤表情符号
    Mybatis框架
    表单(一)
    HTML标签(二)
  • 原文地址:https://www.cnblogs.com/newpanderking/p/3250714.html
Copyright © 2011-2022 走看看