C++ 编程 图的最短算法
原创
©著作权归作者所有:来自51CTO博客作者R9527的原创作品,请联系作者获取转载授权,否则将追究法律责任
#include <iostream>
using namespace std;
struct Mgraph{
int vexnum;
int arcnum;
char *vertex;
int **AdjMatrix;
};
class Graph
{
public:
void CreateUDN();
void DestroyUDN();
void Minispantree_prim();
private:
Mgraph gph; //邻接矩阵存储
};
void Graph::CreateUDN()
{
cout << "输入无向网的顶点数和边数:" << endl;
cin >> gph.vexnum >> gph.arcnum;
gph.vertex = (char *)malloc(gph.vexnum * sizeof(char));
int i,j,m,n; //m,n表示顶点信息对应的序号,w是权值
int w;
char v1,v2;
cout << "输入顶点信息:" << endl;
for(i = 0;i < gph.vexnum;i++)
cin >> gph.vertex[i];
gph.AdjMatrix = (int **)malloc(gph.vexnum * sizeof(int *));
for(i = 0;i < gph.vexnum;i++)
gph.AdjMatrix[i] = (int *)malloc(gph.vexnum * sizeof(int));
for(i = 0;i < gph.vexnum;i++)
for(j = 0;j < gph.vexnum;j++)
gph.AdjMatrix[i][j] = INT_MAX; //INT_MAX
cout << "输入一条边依附的两点及权值:" << endl;
for(int k = 0;k < gph.arcnum;k++)
{
cin >> v1 >> v2 >> w;
for(i = 0;i < gph.vexnum;i++)
{
if(v1 == gph.vertex[i]) m = i;
if(v2 == gph.vertex[i]) n = i;
}
gph.AdjMatrix[m][n] = gph.AdjMatrix[n][m] = w;
}
}
void Graph::DestroyUDN()
{
free(gph.vertex);
for(int i = 0;i < gph.vexnum;i++)
free(gph.AdjMatrix[i]);
free(gph.AdjMatrix);
}
void Graph::Minispantree_prim()
{
struct closedge
{
int adjvex;
int lowcost;
};
closedge *edge = (closedge *)malloc(gph.vexnum * sizeof(closedge));
int i,j,k = 0,u;
int min;
for(i = 0;i < gph.vexnum;i++)
{
if(i != k)
{
edge[i].adjvex = 0;
edge[i].lowcost = gph.AdjMatrix[k][i];
}
}
edge[k].lowcost = 0;
cout << "最小生成树的边如下:" << endl;
for(i = 1;i < gph.vexnum;i++)
{
min = INT_MAX;
for(j = 0;j < gph.vexnum;j++)
if(edge[j].lowcost != INT_MAX &&edge[j].lowcost != 0 && edge[j].lowcost < min)
{
min = edge[j].lowcost;
k = j;
}
u = edge[k].adjvex;
edge[k].lowcost = 0;
cout << "(" << gph.vertex[u] << "," << gph.vertex[k] << ")" << " ";
for(j = 0;j < gph.vexnum;j++)
if(gph.AdjMatrix[j][k] < edge[j].lowcost)
{
edge[j].lowcost = gph.AdjMatrix[j][k];
edge[j].adjvex = k;
}
}
free(edge);
cout << endl;
}
int main()
{
Graph gph;
gph.CreateUDN();
gph.Minispantree_prim();
gph.DestroyUDN();
return 0;
}
上一篇:C++编程 进制转换
下一篇:C++ 编程 关机小助手
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【算法】带权图的最短路径算法(C++源码)
任务描述有一个含n个顶点(顶点编号0~n-1)的带权图,用邻接矩阵数组A表示,采用分枝限界法求从起点
算法 结点 #include 最短路径 -
C++算法:图中的最短环
现有一个含 n 个顶点的 双向 图,每个顶点按从 0 到 n - 1 标记。图中的边由
算法 c++ 数据结构 图论 BFS -
C++算法:最短回文串
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。示例
c++ 算法 开发语言 回文 字符串处理 -
C++图算法
C++算法-图算法-03
C++ 职场 算法 休闲 图 -
C++ 有向图最短路径之Dijkstra算法 - 第2次改动权值 最短路径 结点