资源简介
我们可用“破圈法”求解带权连通无向图的一棵最小代价生成树。所谓“破圈法”就是“任取一圈,去掉圈上权最大的边”,反复执行这一步骤,直到没有圈为止。请给出用“破圈法”求解给定的带权连通无向图的一棵最小代价生成树的详细算法,并用程序实现你所给出的算法.
这也是复旦大学97年数据结构和操作系统的考研题.答案,亲测可用,c++编写工程。
代码片段和文件信息
// poquan.cpp : 定义控制台应用程序的入口点。
//
#include “stdafx.h“
#include
#include
int n; //存储结点数
int e; //存储边数
#define maxvertexnum 50 //最大结点数
int visited[maxvertexnum];//标记结点是否被访问
float larr[maxvertexnum][maxvertexnum];//存储图的边的权值信息
typedef struct { int ijw;} myedge; //顶点信息为顶点编号,权是整数
myedge* edge;
void createtree()
{
int ij;
for(i=0;i for(j=0;j larr[i][j]=0; //权值为0表示没有该边,即两个结点不邻接
for(i=0;i visited[i]=0;
printf(“请输入边数\n“);
scanf ( “%d“&e);//输入边数
printf(“请输入顶点数\n“);
scanf ( “%d“&n);//输入顶点数
edge=(myedge*)malloc(sizeof(myedge)*e);
printf(“请依次输入边的两个顶点的编号和边权值\n“);
for(i=1;i<=e;i++) //输入e条边的顶点和权值
{scanf(“%d%d%d“&edge[i].i&edge[i].j&edge[i].w);
larr[edge[i].i][edge[i].j]=edge[i].w;
larr[edge[i].j][edge[i].i]=edge[i].w;
}
}
//connect(k)是测试去掉边edge[k]后是否仍然连通,即是否能够DFS遍历完全
int connect( int k)
{
int temp=edge[k].w; //先保存以备恢复
edge[k].w=0; //尝试删除边
larr[ edge[k].i][ edge[k].j]=0;
larr[ edge[k].j][ edge[k].i]=0;
//非递归dfs遍历
//初始化
int top = -1 ;
int stack[1000]; //假设栈空间够用
int i;
for(i=0;i {
visited[i]=0;
}
//从0结点开始遍历
visited[0] = 1 ;
int count=1; //访问的结点数
stack[++top] = 0 ;
while ( top != -1)
{
int v = stack[top] ;
for ( i = 0 ; i < n ; i++)
{
if (larr[v][i] !=0 &&!visited[i])
{
visited[i] = 1 ;
count++;
stack[ ++top ] = i ;
break ;
}
}
if( i == n)
{
top -- ;
}
}
if(count==n) //仍然连通
{
return 1;
}
else
{
edge[k].w=temp; //恢复边
larr[ edge[k].i][ edge[k].j]=temp;
larr[ edge[k].j][ edge[k].i]=temp;
return 0;
}
}
void spntree()
{
int ij;
for(i=2;i<=e;i++) //按权值大小,对边进行逆序排序
{ edge[0]=edge[i];
j=i-1;
while(edge[0].w>edge[j].w) edge[j+1]=edge[j--];
edge[j+1]=edge[0];
}
int k=1;
int eg=e;
while(eg>=n) //破圈,直到边数e=n-1
{ if(connect(k)) //删除边edge[k],若仍连通
{edge[k].w=0;eg--;} //权值置0表示该边被删除
k++; //测试下一条边
}//while
printf(“最小生成树如下:\n“);
for (i=1;i<=e;i++)
{
if(edge[i].w!=0)
{printf(“%d<->%d %d\n“edge[i].iedge[i].jedge[i].w);}
}
}//算法结束
void main()
{
createtree();
spntree();
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2015-03-02 08:36 12.poquan\
目录 0 2015-03-02 08:42 12.poquan\poquan\
目录 0 2015-03-02 08:36 12.poquan\poquan\Debug\
文件 30720 2015-03-02 08:36 12.poquan\poquan\Debug\poquan.exe
文件 313448 2015-03-02 08:36 12.poquan\poquan\Debug\poquan.ilk
文件 429056 2015-03-02 08:36 12.poquan\poquan\Debug\poquan.pdb
目录 0 2015-03-02 08:36 12.poquan\poquan\ipch\
目录 0 2015-03-02 08:36 12.poquan\poquan\ipch\poquan-1033e1d7\
文件 2359296 2015-03-02 08:36 12.poquan\poquan\ipch\poquan-1033e1d7\poquan-6c597ee0.ipch
目录 0 2015-03-02 08:36 12.poquan\poquan\poquan\
目录 0 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\
文件 3026 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\CL.read.1.tlog
文件 706 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\CL.write.1.tlog
文件 1402 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\cl.command.1.tlog
文件 2 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\li
文件 2 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\li
文件 2 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\li
文件 2 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\li
文件 2 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\li
文件 2 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\li
文件 1544 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\li
文件 3416 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\li
文件 768 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\li
文件 364 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\mt.command.1.tlog
文件 286 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\mt.read.1.tlog
文件 286 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\mt.write.1.tlog
文件 406 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\poquan.exe.em
文件 472 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\poquan.exe.em
文件 381 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\poquan.exe.intermediate.manifest
文件 54 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\poquan.lastbuildstate
文件 5102 2015-03-02 08:36 12.poquan\poquan\poquan\Debug\poquan.log
............此处省略21个文件信息
- 上一篇:数字图像处理软件源代码三个资源集合
- 下一篇:VC++环境下如何连接SQL数据库
相关资源
- VC++2012版Prim算法最小生成树动态演示
- 数据结构 图的最小生成树 C++描述 使
- 数据结构课程设计,最小生成树,采
- 最小生成树图形化实现
- Prim 算法、Kruskal 算法和去边法求无向
- 去边法 构造最小生成树 C语言
- 最小生成树MFC
- 最小生成树的源代码(C++实现)
- 用普里姆(Prim)算法构造最小生成树
- 无向图 破圈法求最小生成树
- 可用“破圈法”求解带权连通无向图
- 破圈法构造最小生成树
- 哈夫曼最小生成树及最短路径代码
- 克鲁斯卡尔最小生成树算法
- 数据结构课程设计|利用邻接矩阵创建
- 图形化的最小生成树C++原代码
- 最小生成树 数据结构
- c语言实现最小生成树的prim算法和kr
- 最小生成树 mfc c++
- 数据结构Prim最小生成树
- 图(邻接矩阵深度搜索广度搜索最小
- C语言实现单源路径、多级调度、最小
- kruskal求最小生成树
- 最小生成树课程设计完美参照--本人倾
- Prim和Kruskal算法求最小生成树
评论
共有 条评论