zoukankan      html  css  js  c++  java
  • 数据结构之 图论---最小生成树(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;
    }
    


  • 相关阅读:
    jupyter notebook代码添加行号(菜单中点击view后没有toggle line numbers选项)
    深度学习:tensorflow中激励函数的实现
    深度学习:padding、卷积、stride的计算
    深度学习:mAP(mean average precision)
    java实现桶排序
    java 数组实现队列和栈
    五步学习法
    技术团队组织架构
    Redis的高可用:哨兵和集群
    Redis限流的实现方式有3种
  • 原文地址:https://www.cnblogs.com/yspworld/p/4093559.html
Copyright © 2011-2022 走看看