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;
    }
    
  • 相关阅读:
    React Native基础&入门教程:以一个To Do List小例子,看props和state
    Xamarin 学习笔记
    网站HTTP升级HTTPS完全配置手册
    Xamarin 学习笔记
    Xamarin 学习笔记
    React Native基础&入门教程:初步使用Flexbox布局
    SpreadJS使用进阶指南
    用WijmoJS搭建您的前端Web应用 —— React
    【图解】FlexGrid Explorer 全功能问世
    只用最适合的!全面对比主流 .NET 报表控件
  • 原文地址:https://www.cnblogs.com/luoxiaoyi/p/10025285.html
Copyright © 2011-2022 走看看