今天中午做的 第一次用邻接表去实现...
我就写了下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; }
现在还在被 rmq折磨中......
today:
你说你喜欢AC米兰
所以我做选择题
从来不选BD