数据结构 求最短路径问题

belong_myself 2012-12-16 11:19:19

问题描述: 求任意两个城市之间的最短路径
基本要求:
(1)能够判断任意两个城市之间是否有通路
(2)如果有通路,找到这条最短路经

PS:任意两个城市之间的图粘贴不了,所以就上传了。

这是数据结构的课程设计,求编程代码,最好带有点注释的……
希望各大神帮帮忙!!谢谢!!
...全文
1423 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
belong_myself 2013-01-03
  • 打赏
  • 举报
回复
我已经解决问题了,谢谢
szulee 2012-12-27
  • 打赏
  • 举报
回复
引用 16 楼 belong_myself 的回复:
谢谢大家的帮忙
难道我的代码没有帮你解决到问题?
赵4老师 2012-12-27
  • 打赏
  • 举报
回复
参考Boost.Graph?
szulee 2012-12-26
  • 打赏
  • 举报
回复
贴上效果图
szulee 2012-12-26
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <assert.h>


#define PLACE_MAX_NUM  50   //至多有50个地方点
#define NAME_MAX_SIZE 20	//名字长度至多为20

/*定义(点到点的)边,默认长度为0*/
int placeLength[PLACE_MAX_NUM][PLACE_MAX_NUM] ={0};   

/*定义一个点的相关信息*/
typedef struct
{
	char name[NAME_MAX_SIZE];	//名字
	
	int 	shortLength;				//记录最短路径长度
	int 	lastPlaceID;				//记录最短路径情况下上个点
	bool outFlag;					//若已经处理过,则为true
}placeStr;

placeStr placePoint[PLACE_MAX_NUM] = {0};


/*以下为简易队列的实现*/
class SimpleQueue
{
	private:
		int placeID[PLACE_MAX_NUM];
		int currentStart;
		int currentEnd;

	public:
		SimpleQueue(void)
			{
				memset(&placeID, 0, sizeof(int)*PLACE_MAX_NUM);
				currentStart  = 0;
				currentEnd   = 0;
			}

		int getNext(void)
			{
				if(currentStart >= currentEnd)
					return -1;
				else
					return placeID[currentStart++];
			}

		void addMember(int id)
			{
				placeID[currentEnd++] = id;
			}

		bool isEmpty(void)
			{
				return currentStart >= currentEnd;
			}
};

SimpleQueue queue;
#if 0
typedef struct
{
	int placeID[PLACE_MAX_NUM];
	int currentStart;
	int currentEnd;
}queueStr;

queueStr	queue;

void queueInit(void)
{
	memset(&queue, 0, sizeof(queueStr));
}

int queueGetNext(void)
{
	if(queue.currentStart >= queue.currentEnd)
		return -1;
	else
		return queue.placeID[queue.currentStart++];
}

void queueAdd(int id)
{
	queue.placeID[queue.currentEnd++] = id;
}

bool queueIsEmpty(void)
{
	return queue.currentStart >= queue.currentEnd;
}
/*以上为简易队列的实现*/
#endif


void setIdByString(char *string)
{
	static int i =0;
	assert(i < PLACE_MAX_NUM);
	strcpy(placePoint[i].name, string);
	i++;
}

int getIdByString(char *string)
{
	int i;
	for(i=0; i<PLACE_MAX_NUM; i++)
	{
		if(strcmp(string,placePoint[i].name) == 0)
			return i;
	}
	return -1;
}

void addPath(char *place1, char *place2, int length)
{
	int id1,id2;
	id1 = getIdByString(place1);
	id2 = getIdByString(place2);
	//if(id1 == -1 || id2 ==-1)
	assert(id1 != -1 && id2 !=-1);
	placeLength[id1][id2] = length;
	placeLength[id2][id1] = length;
}
	
void init(void)
{
	memset(placePoint, 0 ,sizeof(placeStr) * PLACE_MAX_NUM);
	
	setIdByString("wulumuqi");
	setIdByString("huhehaote");
	setIdByString("haerbin");
	setIdByString("changchun");
	setIdByString("beijing");
	setIdByString("tianjing");
	setIdByString("shenyang");
	setIdByString("dalian");
	setIdByString("xining");
	setIdByString("lanzhou");
	setIdByString("xian");
	setIdByString("zhengzhou");
	setIdByString("xuzhou");
	setIdByString("chengdu");
	setIdByString("wuhan");
	setIdByString("shanghai");
	setIdByString("kunming");
	setIdByString("huangyang");
	setIdByString("zhuzhou");
	setIdByString("nanchang");
	setIdByString("fuzhou");
	setIdByString("liuzhou");
	setIdByString("nanning");
	setIdByString("guangzhou");
	setIdByString("shenzhen");
	setIdByString("guiyang");
	
	addPath("wulumuqi","lanzhou",1892);
	addPath("xining","lanzhou",216);
	addPath("xian","lanzhou",676);
	addPath("xian","zhengzhou",511);
	addPath("xuzhou","zhengzhou",349);
	addPath("xuzhou","tianjing",674);
	addPath("huhehaote","lanzhou",1145);
	addPath("huhehaote","beijing",668);
	addPath("zhengzhou","beijing",695);
	addPath("tianjing","beijing",137);
	addPath("tianjing","shenyang",704);
	addPath("shenyang","dalian",397);
	addPath("shenyang","changchun",305);
	addPath("changchun","haerbin",242);
	addPath("xian","chengdu",842);
	addPath("kunming","chengdu",1100);
	addPath("guiyang","chengdu",967);
	addPath("kunming","guiyang",639);
	addPath("zhuzhou","guiyang",902);
	addPath("zhengzhou","wuhan",534);
	addPath("zhuzhou","wuhan",409);
	addPath("xuzhou","shanghai",651);
	addPath("nanchang","shanghai",825);
	addPath("nanchang","zhuzhou",367);
	addPath("nanchang","fuzhou",622);
	addPath("guiyang","liuzhou",607);
	addPath("nanning","liuzhou",255);
	addPath("zhuzhou","liuzhou",672);
	addPath("zhuzhou","guangzhou",675);
	addPath("shenzhen","guangzhou",140);
}

/*最短路径算法*/
void dijkstra(int id1)
{
	if(placePoint[id1].outFlag == true)
		return;
	for(int id2=0; id2<PLACE_MAX_NUM;id2++)
		if(placeLength[id1][id2])
			if(placePoint[id2].shortLength == 0 || placePoint[id2].shortLength >placePoint[id1].shortLength + placeLength[id1][id2])
				{
					placePoint[id2].shortLength =placePoint[id1].shortLength + placeLength[id1][id2];
					placePoint[id2].lastPlaceID = id1;
					queue.addMember(id2);
				}
	placePoint[id1].outFlag = true;		
}

void printResult(char *place1, char *place2)
{
	int id1 = getIdByString(place1);
 	int id2 = getIdByString(place2);
	
	printf("从%s 到%s,最短长度为%d,以下为路线:\n\n",place1,place2,placePoint[id2].shortLength);
	
	while(id1 != id2)
		{
			printf("  %s   <--   ",placePoint[id2].name);
			id2 = placePoint[id2].lastPlaceID;
		}
	printf(" %s\n\n",place1);
	
	
}


void findShortestPath(char *place1, char *place2)
{
	queue.addMember(getIdByString(place1));
	while(!queue.isEmpty())
		dijkstra(queue.getNext());
	printResult(place1, place2);
}


int main(void)
{
	init();
	findShortestPath("nanning","xuzhou");
	
	return 0;

}
看了楼主帖子。 想想之前貌似没写过最短路径算法。动手写了写。 纯手打。望采纳。望指出不足。
belong_myself 2012-12-26
  • 打赏
  • 举报
回复
谢谢大家的帮忙
依水寒 2012-12-25
  • 打赏
  • 举报
回复
记得很多年前用Turbo C写过这个程序,自己将网络拓扑图映射成数据结构中的邻接表,将各结点与其他结点的连接边中的权重都反映到这个邻接表中,利用一个堆栈,将每走过的一个结点都压于堆栈中,采用的是穷尽策略,从A点到B点的所有可能的路径全部找出来,再从中选择一条最短的路径。 记得这是当年学《计算机网络原理》时,写的一个路由器算法作为课程设计
ForestDB 2012-12-25
  • 打赏
  • 举报
回复
话说我至今也写不出来这个算法。
SKATE11 2012-12-25
  • 打赏
  • 举报
回复
我以前的课程设计也是这个 我用了dijsktra算法 七七八八的写了八百多行代码 要的话我发给你参考下
独孤过儿 2012-12-25
  • 打赏
  • 举报
回复
(1)能够判断任意两个城市之间是否有通路 假设任意两个点分别为s和t,s为起始点,t为终点,用DFS来判断s与t之间是否有通路 (2)如果有通路,找到这条最短路经 如果是确定两点之间的最短路径,用Dijkstra算法来寻找。 如果是每对顶点之间的最短路径,用Floyd-Warshall算法来求。 详细的内容可以参考《算法导论》
pengfoo 2012-12-25
  • 打赏
  • 举报
回复
最短路径问题。搜Dijkstra算法
miliggate 2012-12-25
  • 打赏
  • 举报
回复
这个似乎没有完全解
belong_myself 2012-12-24
  • 打赏
  • 举报
回复
我需要把某个地方到每一个地方的距离输入在记事本里,然后再文件打开,比较记事本里的数字大小得出最短路径吗?
belong_myself 2012-12-24
  • 打赏
  • 举报
回复
谢谢。我先改着先吧。。
hekeguang 2012-12-16
  • 打赏
  • 举报
回复
我也学习一下。
newtee 2012-12-16
  • 打赏
  • 举报
回复
自己改改吧! 问题解决记得结贴啊 谢
newtee 2012-12-16
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#define MAXINT 5000
#define VEX_NUM 7
#define ARC_NUM 10
typedef struct{
	char vexs[VEX_NUM];
	int arcs[VEX_NUM][VEX_NUM];
	}Mgraph;
void creat_Mgraph(Mgraph *G);
void Dijkstra(Mgraph Gn,int v,int path[],int dist[]);
void Putpath(int v,int p[],int d[]);
void printpath(int v,int u,int p[],int d[]);
main()
{
        char city[7][20]={"beijing","xian","zhengzhou","xuzhou","chengdu","guangzhou","shanghai"};
	Mgraph Gn;
	int i,m,n;
	int path[VEX_NUM],dist[VEX_NUM];
	char s[4];
	for(;;)
	{
		printf("1.建立交通图的存储结构\n");
		printf("2.求某城市到所有城市的最短路径\n");
		printf("3.求任意两个城市之间的最短路径\n");
		printf("4.退出\n");
        gets(s);
		switch(*s)
		{
		  case'1':creat_Mgraph(&Gn);
			  break;
		  case'2':printf("请输入城市:\n");
			  scanf("%d",&i);
			  Dijkstra(Gn,i,path,dist);
			  Putpath(i,path,dist);
			  break;
		  case'3':printf("请输入城市:\n");
			  scanf("%d,%d",&m,&n);
			  Dijkstra(Gn,m,path,dist);
			  printpath(m,n,path,dist);
			  break;
		  case'4':exit(0);
			  break;
		}
	}
}
void creat_Mgraph(Mgraph *G)
{
		int i,j,k,w;
		printf("\n inuput vextex:");
		for(i=0;i<VEX_NUM;i++)
		     scanf("%c",&G->vexs[i]);
		for(i=0;i<VEX_NUM;i++)
		for(j=0;j<VEX_NUM;j++)
		     G->arcs[i][j]=MAXINT;
		printf("\n input edge(i,j,w):\n");
		for(k=1;k<=ARC_NUM;k++)
		{
		    scanf("%d,%d,%d",&i,&j,&w);
		    G->arcs[i][j]=w;
		    G->arcs[j][i]=w;
		}
}
void Putpath(int v,int p[],int d[])
{
		int i,j,next;
		for(i=0;i<VEX_NUM;i++)
		  if(d[i]<MAXINT&&i!=v)
		  {
			printf("%c<--",city[i]);
			next=p[i];
			while(next!=v)
			{
			    printf("%c<--",city[next]);
			    next=p[next];
			}
		    printf("%c:%d\n",city[v],d[i]);
		  }
}
void printpath(int v,int u,int p[],int d[])
{
     int i,j,next;
     for(i=0;i<VEX_NUM;i++)
	if(d[i]<MAXINT&&i==u)
        {  
            printf("%c<--",city[i]);
            next=p[i];
            while(next!=v)
            {  
                 printf("%c<--",city[next]);
	         next=p[next];
            }
	         printf("%c:%d\n",city[v],d[i]);
        }
}
         
void Dijkstra(Mgraph Gn,int v,int path[],int dist[])
{
	int i,j,w,k,min;
	int s[VEX_NUM];
	for(j=0;j<VEX_NUM;j++)
	{
		s[j]=0;
		dist[j]=Gn.arcs[v][j];
		if(dist[j]<MAXINT)
			path[j]=v;
		else
			path[j]=-1;
	}
	dist[v]=0;
	s[v]=1;
	for(i=0;i<VEX_NUM;i++)
	{
		min=MAXINT;
		for(w=0;w<VEX_NUM;w++)
			if(!s[w]&&dist[w]<min)
			{
				j=w;
				min=dist[w];
			}
			s[j]=1;
			for(k=0;k<VEX_NUM;k++)
				if(!s[k]&&(min+Gn.arcs[j][k]<dist[k]))
				{
					dist[k]=min+Gn.arcs[j][k];
					path[k]=j;
				}
	}
}
newtee 2012-12-16
  • 打赏
  • 举报
回复
我做过的
qq45000 2012-12-16
  • 打赏
  • 举报
回复
受教了。。。。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧