多段图的最短路径领接表法

来源:互联网 发布:linux授权文件夹给用户 编辑:程序博客网 时间:2024/06/11 23:59

     以下是例图


实现代码 过程都在注释里

#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指向一个边结点,未分配时候姑且初始化为nullfor (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;//指向下一个邻接点//}EdgeNodepe = (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;//2cout << Gp->adlist[11].firstedge->adjvex << endl;cout << en->adjvex << endl;en = en->next;//3cout << 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 211234567891011121 2 91 3 71 4 31 5 22 6 42 7 22 8 13 6 23 7 74 8 115 7 115 8 86 9 66 10 57 9 47 10 38 10 58 11 69 12 410 12 211 12 5*//*日志:2017年11月2日23:33:31输入存储数据已经校验过,没有问题2017年11月3日00:41:37按内容输入已经无误 完美输出*/


原创粉丝点击