求解图的单源最短路径问题

问题一

void creatMGraph(int n,int e,MGraph *g,int edge[][MAXV])
{	g=(MGraph*)malloc(sizeof(MGraph));
	g->n=n;g->e=e;
	for(int i=0;iedges[i][j]=edge[i][j];
}

本想调用这个函数用现有的边数和定点数,以及图的邻接矩阵构建一个图。这个函数中有一个形参是邻接图的指针,但是由于它仅仅是个指针,尚未被分配任何空间,所以我在函数体中调用了malloc函数为其分配一个MGraph大小的空间来存放想要构建的邻接图。注意这个malloc函数实际上是又创造了一个指针变量,以及它所指向的内存空间,因此在将这个变量赋值给g的时候,g是发生了变化的。而指针变量作为函数的形式参数时,虽然我们可以改变其所指向的值,但是并不能改变指针变量本身的值,因此需要在这个指针变量的形参前加一个引用符。改动后如下所示。

void creatMGraph(int n,int e,MGraph *&g,int edge[][MAXV])
{	g=(MGraph*)malloc(sizeof(MGraph));
	g->n=n;g->e=e;
	for(int i=0;iedges[i][j]=edge[i][j];

问题二

求解图的单源最短路径问题_第1张图片

VC 2010下载地址 https://www.xiazaiba.com/html/1832.html

问题三

#include
#include
#include
#include 
#include
#define MAXV 20
#define INF 0x3f3f3f3f
using namespace std;

typedef  struct 
{	int n,e;
	int edges[MAXV][MAXV];
}MGraph;
int pre[MAXV];
int dissum=0,dismax=0x3f3f3f3f;
queue qu;
stack opt;
int visted[MAXV];
void creatMGraph(int n,int e,MGraph *&g,int edge[][MAXV])
{	g=(MGraph*)malloc(sizeof(MGraph));
	if(g)					//malloc函数是在内存空间中寻找空闲的内存块,假如申请的内存太大,找不到这样规模的内存时会返回一个NULL指针
	{	printf("malloc success\n");
		g->n=n;g->e=e;
		for(int i=0;iedges[i][j]=edge[i][j];
	}
	else
		printf("malloc error");
}
void printp(int s,int d)
{	printf("s和d之间的最短路径是:\n%d",s);
	while(!opt.empty())
	{	printf("-->%d",opt.top());
		opt.pop();
	}
	printf("   最短距离为%d",dismax);
}
void findp(int s,int d,MGraph* g)
{	pre[s]=-1;
	visted[s]=1;
	qu.push(s);
	int front;
	while(!qu.empty())
	{	front=qu.front();qu.pop();
		if(front==d) 
		{	dissum=0;
			while(front!=s)
			{	dissum+=g->edges[pre[front]][front];
				front=pre[front];
			}
			front=d;
			if(dissumn);i++)
			{	int dis=g->edges[front][i];
				if(dis!=0&&dis!=INF)
				{	pre[i]=front;
					qu.push(i);
				}
			}
		
		 } 
	}
	
}

int main()
{	int a[5][MAXV];
	MGraph *g;
	memset(a,INF,sizeof(a));
	memset(pre,-2,sizeof(pre));
	a[0][2]=10;a[0][4]=30;a[0][5]=100;a[1][2]=4;a[2][3]=50;
	a[3][5]=10;a[4][3]=20;a[4][5]=60;
	for(int i=0;i<6;i++)
		a[i][i]=0;
	creatMGraph(6,8,g,a);
	findp(0,3,g);
	printp(0,3);
	free(g);   //18.41 改动以防止内存泄露!
	g=NULL;  
	
}

为什么g->edges数组中 只要从【X】【5】之后的数都被初始化为 -842150451
而不是memset所设定的0x3f3f3f3f呢?????
明白了 因为creatMGraph中的循环变量i,j都小于g->n

你可能感兴趣的:(算法设计与分析-李春葆)