zoukankan      html  css  js  c++  java
  • 图结构练习——最小生成树 分类: 最小生成树 图论 2015-06-09 17:00 13人阅读 评论(0) 收藏

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

    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 <map>
    #include <set>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <stdio.h>
    #include <cmath>
    #include <string.h>
    #include <string>
    #include <algorithm>
    #define  INF 0x3f3f3f3f
    #define ClearAll(A,T) memset(A,T,sizeof(a))
    using namespace std;
    const int Max=110;
    struct Line
    {
        int u;
        int v;
        int w;
    }Map[Max*Max];
    
    bool vis[Max];
    
    int Pre[Max];
    
    int n,m;
    
    bool cmp(Line a,Line b)//排序
    {
        return a.w<b.w;
    }
    // 并查集
    int Find(int x)
    {
        int i=x,j=x,r;
        while(Pre[i]!=i)
        {
            i=Pre[i];
        }
        while(Pre[j]!=j)
        {
            r=Pre[j];
            Pre[j]=i;
            j=r;
        }
        return i;
    
    }
    void Insert(int x,int y)
    {
        int Fx=Find(x);
        int Fy=Find(y);
        if(Fx!=Fy)
        {
            Pre[Fx]=Fy;
        }
    }
    //初始化
    void Clear()
    {
        for(int i=1;i<=n;i++)
        {
            Pre[i]=i;
        }
    }
    int  main()
    {
       while(~scanf("%d %d",&n,&m))
       {
           for(int i=0;i<m;i++)
           {
               scanf("%d %d %d",&Map[i].u,&Map[i].v,&Map[i].w);
           }
           Clear();
           sort(Map,Map+m,cmp);
           int sum=0;
           int ans=0;
           //kruskal算法
           for(int i=0;i<m;i++)
           {
               if(Find(Map[i].u)!=Find(Map[i].v))
               {
                   Insert(Map[i].u,Map[i].v);
                   sum+=Map[i].w;
                   ans++;
               }
               if(ans==n-1)
               {
                   break;
               }
           }
           printf("%d
    ",sum);
       }
        return 0;
    }
    
    prim<pre name="code" class="cpp">#include <map>
    #include <set>
    #include <vector>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    #include <iostream>
    #define INF 0x3f3f3f3f
    #define ClearAll(A,T) memset(A,T,sizeof(A))
     
    using namespace std;
     
    const int Max=110;
     
    int Map[110][110];
     
    bool vis[Max];
     
    int Dist[Max];
     
    int n,m;
     
    void Prime()
    {
        int sum=0;
        ClearAll(vis,false);
        for(int i=1; i<=n; i++)
        {
            Dist[i]=Map[1][i];
     
        }
        vis[1]=true;
        int i,j;
        for( i=1; i<n; i++)
        {
            int MAX=INF;
            int flag;
            for( j=1; j<=n; j++)
            {
                if(MAX>Dist[j]&&!vis[j])
                {
                    MAX=Dist[j];
                    flag=j;
                }
            }
            vis[flag]=true;
            sum+=MAX;
            for( j=1; j<=n; j++)
            {
                if(Dist[j]>Map[flag][j]&&!vis[j])
                {
                    Dist[j]=Map[flag][j];
                }
            }
        }
        printf("%d
    ",sum);
    }
     
    int main()
    {
        int u,v,w;
        while(~scanf("%d %d",&n,&m))
        {
            ClearAll(Map,INF);
            for(int i=1; i<=m; i++)
            {
                scanf("%d %d %d",&u,&v,&w);
                if(Map[u][v]>w)
                {
                    Map[u][v]=w;
                    Map[v][u]=w;
                }
            }
            Prime();
        }
        return 0;
    }
     
     



     
    
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    【LeetCode】048. Rotate Image
    【LeetCode】036. Valid Sudoku
    【LeetCode】060. Permutation Sequence
    【LeetCode】001. Two Sum
    【LeetCode】128. Longest Consecutive Sequence
    【LeetCode】081. Search in Rotated Sorted Array II
    【LeetCode】033. Search in Rotated Sorted Array
    顺时针打印矩阵
    矩形覆盖
    二维数组中的查找
  • 原文地址:https://www.cnblogs.com/juechen/p/4722050.html
Copyright © 2011-2022 走看看