以下是例图
实现代码 过程都在注释里
#include<iostream>
using namespace std;
#define MAXVEX 100 /* 最大顶点数,应由用户定义 */
typedef struct EdgeNode /* 边表结点 */
{
int adjvex;//顶点对应下标
int weight;//权值
EdgeNode *next;//指向下一个邻接点
}EdgeNode;
typedef struct VextexNode
{
int data;
EdgeNode *firstedge;
}VextexNode, AdjList[MAXVEX];
typedef struct {
AdjList adlist;
int numNodes, numEdges;/* 图中当前顶点数和边数 */
}GraphAdjList;
void createALGraph(GraphAdjList *Gp)
{
int i, j, k, wig;
EdgeNode *pe;
cout << "请输入顶点数和边数(空格分隔):" << endl;
cin >> Gp->numNodes >> Gp->numEdges;//
//表结点的fisrtdge指向一个边结点,未分配时候姑且初始化为null
for (int i = 0; i < Gp->numNodes; i++)
{
cout << "输入顶点信息:" << endl;
cin >> Gp->adlist[i].data;
Gp->adlist[i].firstedge = NULL;
}
//
for (int k = 0; k < Gp->numEdges; k++)
{
cout << "输入边(vi,vj)的顶点序号以及权重i,j,weight(空格分隔):" << endl;
cin >> i >> j >> wig;//i->j w=wig
// typedef struct EdgeNode /* 边表结点 */
// {
// int adjvex;//顶点对应下标
// int weight;//权值
// EdgeNode *next;//指向下一个邻接点
// }EdgeNode
pe = (EdgeNode*)malloc(sizeof(EdgeNode));//申请空间
pe->next = NULL;
pe->weight = wig;
pe->adjvex = i;/*邻接序号为i*/
/*将pe的指针指向当前顶点上指向的结点*/
pe->next = Gp->adlist[j - 1].firstedge;//把挂在adlist[j-1]上的EdgeNode结点挂在pe后面
Gp->adlist[j - 1].firstedge = pe;/*pe结点挂到adlist[j-1]上*/
}
}
void multiStageGraph(GraphAdjList *Gp)
{
int n= Gp->numNodes - 1;
int routine[100] = { 0 };
int k = 0;
routine[k++] = 12;
while (n)//n为0 也就是signNode->adjvex为1的时候停止循环
{
/*首先必然是从12号结点 也就是序列为11的顶点表起步*/
EdgeNode *en =
Gp->adlist[n].firstedge; //en指向第一个边
EdgeNode *signNode = NULL;//临时记录较大权重的结点
int signWeight = 0;//临时记录较大权重
/*比较每个顶点后 表边的权值 并且选择最大值*/
signNode = en; //signNode标记指针姑且指向第一条边
signWeight = en->weight;
while (en->next)//如果en边存在下一条边的话
{
en = en->next;
if (en->weight<signWeight)//en指向的当前边要是比标记边小的话
{
signNode = en;
signWeight = en->weight;
}
}
//循环过后获得最小权重的边的标号
n = signNode->adjvex - 1;
routine[k++] = signNode->adjvex;
}
cout << "the routine is:" << endl;
while (k--)
{
cout << routine[k] << " ";
}
cin.get();
}
void test(GraphAdjList *Gp)//测试用函数
{
cout << Gp->numEdges << " " << Gp->numNodes << endl;
cout << "校验顶点信息" << endl;
for (int i = 0; i < Gp->numNodes; i++)
{
cout << Gp->adlist[i].data << endl;
}
cout << "校验表头结点 (按结果看没毛病)" << endl;
for (int i = 0; i < Gp->numNodes; i++)
{
bool s;
s = Gp->adlist[i].firstedge == NULL;
cout << s<< endl;
/*cout << "下面是校验连着的点" << endl;
if (Gp->adlist[i].firstedge)
{
EdgeNode *en;
en = Gp->adlist[i].firstedge;
do
{
en = en->next;
cout << "编号:" << en->adjvex << "权重:" << en->weight<<endl;
} while (en!=nullptr);
}*/
}
EdgeNode *en;
en = Gp->adlist[11].firstedge;
en = en->next;//2
cout << Gp->adlist[11].firstedge->adjvex << endl;
cout << en->adjvex << endl;
en = en->next;//3
cout << en->adjvex;
cout << Gp->adlist[2].firstedge->adjvex << " " << Gp->adlist[2].firstedge->weight << endl;
cin.get();
}
int main()
{
GraphAdjList GL;
createALGraph(&GL);
multiStageGraph(&GL);
// test(&GL);
cin.get();
return 0;
}
//输入
/*
12 21
1
2
3
4
5
6
7
8
9
10
11
12
1 2 9
1 3 7
1 4 3
1 5 2
2 6 4
2 7 2
2 8 1
3 6 2
3 7 7
4 8 11
5 7 11
5 8 8
6 9 6
6 10 5
7 9 4
7 10 3
8 10 5
8 11 6
9 12 4
10 12 2
11 12 5
*/
/*
日志:
2017年11月2日23:33:31
输入存储数据已经校验过,没有问题
2017年11月3日00:41:37
按内容输入已经无误 完美输出
*/