zoukankan      html  css  js  c++  java
  • HDU 1301 Jungle Roads (最小生成树,基础题,模版解释)——同 poj 1251 Jungle Roads

    双向边,基础题,最小生成树
     
     
     
    #define  _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include<string.h>
    #include <malloc.h>
    #include<stdlib.h>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    
    #define inf 999999999
    #define M 110
    int mat[M][M];
    
    int prim(int n,int sta)
    {
        int mark[M],dis[M];
        int i,sum=0,j;
        for(i=0;i<n;i++)
        {
            dis[i]=mat[sta][i];
            mark[i]=0;
        }
        mark[sta]=1;
        for(i=0;i<n;i++)
        {
            int minn=inf,flag=-1;;
            for(j=0;j<n;j++)
            {
                if(mark[j]==0&&dis[j]<minn)
                {
                    minn=dis[j];
                    flag=j;
                }
            }
            if(flag!=-1)
            {
                mark[flag]=1;
                sum=sum+dis[flag];
                for(j=0;j<n;j++)
                {
                    if(dis[j]>mat[flag][j])
                        dis[j]=mat[flag][j];
                }
            }
        }
        return sum;
    }
    
    int main()
    {
        int n,i,j,m,adj;
        char s,e;
        while(scanf("%d",&n),n)
        {
            
            for(i=0;i<n;i++)
                for(j=0;j<n;j++)
                    mat[i][j]=inf;
            n--;
            for(i=0;i<n;i++)
            {
                cin>>s>>m;
                for(j=0;j<m;j++)
                {
                    cin>>e>>adj;
                    mat[s-'A'][e-'A']=mat[e-'A'][s-'A']=adj;//擦,原来这题的最小生成树也是双向边
                }
            }
            n++;
            printf("%d
    ",prim(n,0));
        }
        return 0;
    }
    View Code
    //关键代码参考自模版:
    //prim算法(矩阵形式):
    
    #define inf 0x3f3f3f3f
    int prim(int n,int sta)//n表示有n个顶点,sta表从sta这个顶点出发生成最小生成树
    {
        int mark[M],dis[M];
        int i,sum = 0;     //sum是总的最小生成树边权值
        for (i = 0;i < n;i ++) //初始化dis[i] 表从顶点sta到点i的权值
        {
            dis[i] = mat[sta][i];
            mark[i] = 0;
        }
        mark[sta] = 1;           //sta 这个顶点加入最小生成树中
        for (i = 1;i < n;i ++)   //循环n-1次,每次找出一条最小权值的边 n个点的图
        {                        //只有n-1条边
            int min = inf;       //inf 表无穷大
            for (j = 0;j < n;j ++)//找出当前未在最小生成树中边权最小的顶点
                if (!mark[j] && dis[j] < min)
                    min = dis[j],flag = j;
            mark[flag] = 1;         //把该顶点加入最小生成树中
            sum += dis[flag];       //sum加上其边权值
            for (j = 0;j < n;j ++)  //以falg为起点更新到各点是最小权值
                if (dis[j] > mat[flag][j])
                    dis[j] = mat[flag][j];
        }
        return sum;       //返回边权总和
    }
    prim 模版
    一道又一道,好高兴!
  • 相关阅读:
    如何编译树莓派内核
    代码导出Reporting Services报表文件
    Bit-Coin收入的一分钱
    如何在树莓派上运行雷神之锤III
    新树莓派入手
    如何通过PowerShell在Visual Studio的Post-build中预热SharePoint站点
    每日一题20201218(389. 找不同)
    每日一题20201217(714. 买卖股票的最佳时机含手续费)
    每日一题20201216(290. 单词规律)
    每日一题20201215(738. 单调递增的数字)
  • 原文地址:https://www.cnblogs.com/laiba2004/p/3521003.html
Copyright © 2011-2022 走看看