首页 > 代码库 > TOJ--1278--最小生成树

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\n",prim() );
    }
    return 0;
}
View Code

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

 

today:

  你说你喜欢AC米兰

  所以我做选择题

  从来不选BD