zoukankan      html  css  js  c++  java
  • SDUT-3362_村村通公路

    数据结构实验之图论六:村村通公路

    Time Limit: 1000 ms Memory Limit: 65536 KiB

    Problem Description

    当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本。

    Input

    连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供选择的道路数目M(M <= 3000),随后M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个村庄的编号和修建该道路的预算成本,村庄从1~N编号。

    Output

    输出使每个村庄都有公路连通所需要的最低成本,如果输入数据不能使所有村庄畅通,则输出-1,表示有些村庄之间没有路连通。

    Sample Input

    5 8
    1 2 12
    1 3 9
    1 4 11
    1 5 3
    2 3 6
    2 4 9
    3 4 4
    4 5 6

    Sample Output

    19

    题解:一个最小生成树的问题,可以用prim算法来求。

    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int s[1050][1050];/*利用邻接矩阵来记录图*/
    int n;/*n节点数量*/
    int f[1050];/*记录点是否被遍历过*/
    int INF = 1e9+7;/*相当于无穷大*/
    
    int prim()
    {
        int i,sum,j,MIN,k;
        int dis[1050];
        for(i=1;i<=n;i++)
        {
            f[i] = 0;
            dis[i] = s[1][i];
        }
        f[1] = 1;
        sum = 0;
        for(i=1;i<n;i++)/*连接n个点,找n-1条边就可以了*/
        {
            MIN = INF;
            k = -1;
            for(j=1;j<=n;j++)/*寻找最短的边*/
            {
                if(!f[j]&&dis[j]<MIN)
                {
                    MIN = dis[j];
                    k = j;
                }
            }
            if(MIN == INF)/*如果等于INF,则说明无法找到下一条边,证明图不连通,结束函数*/
                return -1;
            f[k] = 1;
            sum += MIN;/*记录最小生成树的边权和*/
            for(j=1;j<=n;j++)
            {
                if(!f[j]&&dis[j]>s[k][j])
                    dis[j] = s[k][j];
            }
        }
        return sum;
    }
    
    int main()
    {
        int m,i,j;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                    s[i][j] = i==j?0:INF;
            for(i=0;i<m;i++)
            {
                int a,b,c;
                scanf("%d%d%d",&a,&b,&c);
                if(c<s[a][b])
                    s[a][b] = s[b][a] = c;
            }
            printf("%d
    ",prim());
        }
        return 0;
    }
    
  • 相关阅读:
    博客园
    未释放的已删除文件
    ssh连接缓慢
    剑指 Offer 38. 字符串的排列
    剑指 Offer 37. 序列化二叉树
    剑指 Offer 50. 第一个只出现一次的字符
    剑指 Offer 36. 二叉搜索树与双向链表
    剑指 Offer 35. 复杂链表的复制
    剑指 Offer 34. 二叉树中和为某一值的路径
    剑指 Offer 33. 二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/luoxiaoyi/p/10025285.html
Copyright © 2011-2022 走看看