64,637
社区成员
发帖
与我相关
我的任务
分享
#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;
}
看了楼主帖子。
想想之前貌似没写过最短路径算法。动手写了写。
纯手打。望采纳。望指出不足。#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;
}
}
}