zoukankan      html  css  js  c++  java
  • hdoj 1875 畅通工程再续

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

    //9403289    2013-10-24 17:00:49    Accepted    1875    62MS    376K    2205 B    C++    空信高手
    #include <iostream>
    #include <cmath>
    #include <iomanip>
    using namespace std;
    #define typec double
    #define V 101
    const typec inf=10000000;
    int vis[V];
    typec lowc[V],cost[V][V];
    typedef struct
    {
        int x;
        int y;
    } POINT;
    POINT pnts[V];
    /*=================================================*
     | Prim求MST
     | INIT: cost[][]耗费矩阵(inf为无穷大);
     | CALL: prim(cost, n); 返回-1代表原图不连通;
    *==================================================*/
    typec prim(int n)
    {
        int i,j,p;
        typec minc,res=0;
        memset(vis,0,sizeof(vis));
        vis[0]=1;
        for(i=1; i<n; i++) lowc[i]=cost[0][i];
        for(i=1; i<n; i++)
        {
            minc=inf;
            p=-1;
            for(j=0; j<n; j++)
            {
                if(0==vis[j]&&minc>lowc[j])
                {
                    minc=lowc[j];
                    p=j;
                }
            }
            if(inf==minc) return -1;
            res+=minc;
            vis[p]=1;
            for(j=0; j<n; j++)
                if(0==vis[j]&&lowc[j]>cost[p][j])lowc[j]=cost[p][j];
        }
        return res;
    }
    
    double calDis(POINT a,POINT b)
    {
        return sqrt(double((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
    }
    void Init()
    {
        int i,j;
        for(i=0; i<V; i++)
            for(j=0; j<V; j++)
                cost[i][j]=10000000;
    }
    int main()
    {
       // freopen("input.txt","r",stdin);
        int n,i,j;
        while(cin>>n&&n!=0)
        {
            while(n--)
            {
                int m;
                double Sum=0;
                cin>>m;
                Init();
                //memset(cost,inf,sizeof(cost));
    
                for(i=0; i<m; i++)
                    cin>>pnts[i].x>>pnts[i].y;
                for(i=0; i<m; i++)
                    for(j=0; j<m; j++)
                    {
                        if(calDis(pnts[i],pnts[j])<=1000.000001&&calDis(pnts[i],pnts[j])>=10.000000)
                            cost[i][j]=calDis(pnts[i],pnts[j]);
                    }
    //            if(!flag) cout<<setiosflags(ios::fixed)<<setprecision(1)<<prim(m)*100<<endl;
    //            else cout<<"oh!"<<endl;
                Sum=prim(m);
                if(Sum<0) cout<<"oh!"<<endl;
                else cout<<setiosflags(ios::fixed)<<setprecision(1)<<Sum*100<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    verilog中timescale
    [shell] if语句用法
    makefile编写
    linux下压缩解压缩命令
    python获取文件所在目录
    gvim 技巧
    vcs编译verilog/sysverilog并执行
    verilog中signed的使用
    [leetcode]_String to Integer (atoi)
    [leetcode]_Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/panweishadow/p/3386529.html
Copyright © 2011-2022 走看看