• 数据结构之 图论---最小生成树(prim + kruskal)


    图结构练习——最小生成树

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

     有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
     

    输入

     输入包含多组数据,格式如下。
    第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n<=100)
    剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
     

    输出

     每组输出占一行,仅输出最小花费。

    示例输入

    3 2
    1 2 1
    1 3 1
    1 0
    

    示例输出

    2
    0
    
    #include <iostream>
    #include <string>
    #include <stdio.h>
    #include <string.h>
    #define INF 99999999
    
    using namespace std;
    int sum;
    int map[110][110];
    int cost[110];
    bool vis[110];
    
    void prim(int n)   //普利姆 最小生成树算法实现
    {
        sum=0;
        int i, j, pos, mincost;
    
        memset(vis, false, sizeof(vis));
        for(i=1; i<=n; i++)
        {
            cost[i]=map[1][i];
        }
        vis[1]=true;
        for(i=1; i<n; i++)
        {
            mincost=INF;
            for(j=1; j<=n; j++)
            {
                if(!vis[j] && mincost>cost[j] )
                {
                    mincost=cost[j];
                    pos=j;
                }
            }
            vis[pos]=true;
            sum+=cost[pos];
            for(j=1; j<=n; j++)
            {
                if(!vis[j] && map[pos][j]<cost[j] )
                {
                    cost[j]=map[pos][j];
                }
            }
        }
    }
    
    int main()
    {
        int n, m;
        int i, j;
        int u, v, w;
        while(cin>>n>>m)
        {
            for(i=0; i<=n; i++)
            {
                for(j=0; j<=n; j++)
                {
                    map[i][j]=INF;
                }
            }
            for(i=0; i<m; i++)
            {
                cin>>u>>v>>w;
                if(map[u][v] > w)
                {
                    map[u][v]=w;
                    map[v][u]=w;
                }
            }
            prim(n);
            cout<<sum<<endl;
        }
        return 0;
    }
    


  • 相关阅读:
    Linux 修改最大线程数
    Openresty+Nginx+Lua+Nginx_http_upstream_check_module 搭建
    SSDB 性能测试
    面向对象:类的成员
    封装,多态,类的约束,super()深入了解
    面向对象:继承
    面向对象:类的空间问题,类之间关系
    面向对象初识
    软件开发规范
    模块(四)包和logging日志
  • 原文地址:https://www.cnblogs.com/yspworld/p/4093559.html
Copyright © 2020-2023  润新知