zoukankan      html  css  js  c++  java
  • hdu 1233 还是畅通工程(prim和kruskal最小生成树)

    hdu 1233 还是畅通工程(prim和kruskal)

    http://acm.hdu.edu.cn/showproblem.php?pid=1233

    还是畅通工程Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 14263    Accepted Submission(s): 6485


    Problem Description
    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
     

    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
    当N为0时,输入结束,该用例不被处理。
     

    Output
    对每个测试用例,在1行里输出最小的公路总长度。
     

    Sample Input
    3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
     

    Sample Output
    3 5 

    prim算法:

    #include<iostream>
    using namespacestd;#define INF 999999 intmap[101][101];
    int
    v[101],dis[101];
    int
    prim(intn)
    {

        int
    i;
        for
    (i=2;i<=n;i++)
            dis[i]=map[1][i];
        memset(v,0,sizeof(v));
        v[1]=1;
        int
    sum=0,k=1,min,j;
        for
    (i=2;i<=n;i++)
        {

            min=INF;
            for
    (j=2;j<=n;j++)
                if
    (!v[j]&&dis[j]<min)
                {

                    k=j;
                    min=dis[j];
                }

            if
    (min!=INF)
                sum+=min;
            v[k]=1;
            for
    (j=1;j<=n;j++)
                if
    (k!=j&&map[k][j]<dis[j])
                    dis[j]=map[k][j];
        }

        return
    sum;
    }

    int
    main()
    {

        int
    n;
        while
    (~scanf("%d",&n)&&n)
        {

            int
    m=n*(n-1)/2;
            int
    x,y,p;
            while
    (m--)
            {

                scanf("%d%d%d",&x,&y,&p);
                map[x][y]=p;
                map[y][x]=p;
            }

            printf("%d\n",prim(n));
        }

        return
    0;
    }

    kruskal算法:

    #include<iostream>
    #include<algorithm>
    using namespacestd;
    struct
    nod
    {

        int
    x,y,v;
    }
    node[5010];
    int
    parent[101];
    int
    comp(nod a,nod b){returna.v<b.v;}
    int
    findp(inta)
    {

        while
    (a!=parent[a])
            a=parent[a];
        return
    a;
    }

    int
    deal(nod a)
    {

        int
    x=findp(a.x);
        int
    y=findp(a.y);
        if
    (x!=y)
        {

            parent[y]=x;
            return
    a.v;
        }

        return
    0;
    }

    int
    main()
    {

        int
    n;
        while
    (~scanf("%d",&n)&&n)
        {

            int
    m=n*(n-1)/2;
            int
    i,j;
            for
    (i=1;i<=n;i++)
                parent[i]=i;
            for
    (i=0;i<m;i++)
                scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].v);
            sort(node,node+m,comp);
            int
    sum=0;
            for
    (i=0;i<m;i++)
                sum+=deal(node[i]);
            printf("%d\n",sum);
        }

        return
    0;
    }

  • 相关阅读:
    Spring MVC-静态页面示例(转载实践)
    Spring MVC-页面重定向示例(转载实践)
    Spring中获取Session的方法汇总
    Spring Boot项目@RestController使用重定向redirect
    MySQL Workbench常用快捷键及修改快捷键的方法
    Eclipse安装Jetty插件(Web容器)
    Java EE: XML Schemas for Java EE Deployment Descriptors(Java Web的web.xml头web-app标签上的XML模式)
    Ubuntu 16.04 GNOME在桌面左侧添加启动器(Launcher)
    Ubuntu 16.04 GNOME添加桌面图标/在桌面上显示图标
    Ubuntu 16.04修改显示字体大小(包括GNOME/Unity)
  • 原文地址:https://www.cnblogs.com/crazyapple/p/2999487.html
Copyright © 2011-2022 走看看