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

     以下是例图


实现代码 过程都在注释里

#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
按内容输入已经无误 完美输出


*/


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值