首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

使用prim算法求最小生成树,该如何解决

2012-03-22 
使用prim算法求最小生成树要求如下:从键盘上输入无向带权图的各顶点和边上的权值,要求完成:1)以邻接表存储

使用prim算法求最小生成树
要求如下:
从键盘上输入无向带权图的各顶点和边上的权值,要求完成:1)以邻接表存储图的边信息;2)输出该图的各顶点及邻接表;3)计算各顶点的度;4)使用Prim算法求出该图的最小生成树。

[解决办法]
随便一本数据结构的书上都有!
最好用邻接矩阵作为存储结构
比较方便
#include <iostream>
#include <algorithm>

using namespace std;

#define BUFSIZE 555
#define ULTIMATE 2000000000

struct Node{
int parent;
int key;
}node[BUFSIZE];

int N,M;
int Graph[BUFSIZE][BUFSIZE];

void init()
{
fill_n(&Graph[0][0],BUFSIZE*BUFSIZE,ULTIMATE);

scanf( "%d%d ",&N,&M);

for(int i=1;i <=M;i++){
int s,d,v;
scanf( "%d%d%d ",&s,&d,&v);
Graph[s][d] = v;
Graph[d][s] = v;
}
}
bool comp(Node a,Node b)
{
if(a.key){
if(b.key)
return a.key <=b.key;
else return true;
}
return false;
}
void prim()
{
SUM = 0;
for(int j=1;j <N;j++){
node[j].parent = N;
node[j].key = Graph[N][j];
}
node[N].key = 0;

for(int i=1;i <N;i++){

Node *p = min_element(node+1,node+1+N,comp);
int k = p - node;

p-> key = 0; //表示点p已经加入了生成树的集合。

for(int j=1;j <N;j++)
if(Graph[k][j] <node[j].key){
node[j].parent = k;
node[j].key = Graph[k][j];
}
}
}

[解决办法]
好像我另外一块硬盘上有写过,还经过测试的,给我发email我如果还在 就给你发过去pkurao@126.om
[解决办法]
我在vs2005下写了一个,经过测试完全满足你的要求.
一共两个project : 一个Graph 还有一个UnDiGraph.
其中Graph project下有3个文件Edge.h, Vertex.h, Graph.h.里面分别是 边类,顶点类和图类.
而UnDiGraph project下只有一个文件夹UnDiGraph.h,里面是UnDiGraph类的定义.
其中 类UnDiGraph 继承自 类Graph.
我是用模板写的,由于编译器不支持类模板的分离编译,所以除了main所在的文件以外,没有.cpp文件.全放在了.h文件中实现.
另外,输入输出我都截图了,可惜发现无法发上来.

热点排行