• TOJ--1278--最小生成树


    今天中午做的 第一次用邻接表去实现...

    我就写了下prim的 相比于kruskal 还是更喜欢它多一点...

    虽然知道prim+heap优化 可是我写不来.....

    对于 heap 虽然觉得它的概念很简单 但实现起来真的好伤啊..

    我想 对于prim的理解应该差不多了 基本上可以直接手码出来了 虽然这个很简单....

    以前原来就有一篇 prim的介绍 那我就懒的写了 直接上代码吧  一般都是用  邻接矩阵实现的..

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    const int size = 30;
    const int inf = 0x3f3f3f3f;
    
    struct graph
    {
        int num;
        int next[20];
        int dist[20];
    }edge[size];
    bool vis[size];
    int dist[size];
    int n;
    
    int prim()
    {
        int i , j , k;
        int mmin;
        int ans = 0; // 生成树的权重
        memset( vis , false , sizeof(vis) );
        for( i = 0 ; i<size ; i++ )
        {
            dist[i] = (i==0) ? 0 : inf; // 初始化 离起始点的距离
        }
        for( i = 0 ; i<edge[0].num ; i++ )
        {
            dist[ edge[0].next[i] ] = edge[0].dist[i];  //更新 离起始点的距离
        }
        vis[0] = true;  // 从0 即A开始寻找最小生成树 标记已访问
        k = 0; 
        for( i = 1 ; i<n ; i++ ) // n-1条边  顶点从0~n-1
        {
            mmin = inf;
            for( j = 1 ; j<n ; j++ )                               
            {
                if( !vis[j] && dist[j]<mmin )
                {
                    mmin = dist[j];
                    k = j;
                }
            }
            if( mmin == inf )
                break;
            vis[k] = true;
            ans+=mmin;
            for( j = 0 ; j<edge[k].num; j++ )
            {
                if( dist[ edge[k].next[j] ] > edge[k].dist[j] && !vis[ edge[k].next[j] ] )
                {
                    dist[ edge[k].next[j] ] = edge[k].dist[j];
                }
            }    
        }
        return ans;
    }
    
    int main()
    {
        int m , len;
        char ch , zh;
        while( ~scanf("%d",&n) &&n )
        {
            for( int i = 0 ; i<size ; i++ )
            {
                edge[i].num = 0;
            }
            getchar();
            for( int i = 0 ; i<n-1 ; i++ )
            {
                scanf( "%c %d",&zh,&m );
                getchar();
                while( m-- )
                {
                    scanf( "%c %d",&ch,&len );
                    getchar();
                    edge[zh-'A'].next[ edge[zh-'A'].num ] = ch-'A';
                    edge[zh-'A'].dist[ edge[zh-'A'].num ] = len;
                    edge[zh-'A'].num++;                           // 注意是 无向图...
                    edge[ch-'A'].next[ edge[ch-'A'].num ] = zh-'A';
                    edge[ch-'A'].dist[ edge[ch-'A'].num ] = len;
                    edge[ch-'A'].num++;
                }
            }
            printf( "%d
    ",prim() );
        }
        return 0;
    }
    View Code

    现在还在被 rmq折磨中......

    today:

      你说你喜欢AC米兰

      所以我做选择题

      从来不选BD

    just follow your heart
  • 相关阅读:
    【云原生小课堂】 一文入门性能凶悍的开源分析数据库ClickHouse
    typescript定义字典方式
    爱前端公开课学习笔记——JS01 认识js 变量
    Web前端基础精品入门(HTML+CSS+JavaScript+JS)[爱前端]听课笔记3:三角形的制作
    爱前端公开课学习笔记——JS03 运算符
    爱前端公开课学习笔记——JS02 字符串类型,布尔类型
    stm32选型手册网址
    altium designer 中怎样画环形线路
    SHA256 在线计算网址
    吴恩达深度学习笔记
  • 原文地址:https://www.cnblogs.com/radical/p/3782778.html
Copyright © 2020-2023  润新知