graph.cpp
来自「图的应用-铁路最短路径的源码以及实验报告!」· C++ 代码 · 共 228 行
CPP
228 行
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define INFINITY 10000
#define MAX_VERTAX_NUM 100
#define FALSE 0
#define TRUE 1
#define NULL 0
typedef struct ArcCell{
int adj; /*相邻接的城市路径长度*/
}ArcCell; /*定义边的类型*/
typedef struct VertexType{
int number; /*城市序号*/
char city[20]; /*城市名称*/
}VertexType; /*顶点类型*/
typedef struct MGraph{
VertexType vexs[MAX_VERTAX_NUM]; /*图中的顶点,即为城市*/
ArcCell arcs[MAX_VERTAX_NUM][MAX_VERTAX_NUM]; /*图中的边,即为城市间的距离*/
int vexnum,arcnum; /*顶点数,边数*/
}MGraph; /*定义图的类型*/
//函数定义
void Save(char filename[10],MGraph G);
int LocateVex(MGraph G,char u[20]);
void CreateUDN();
void Save(char filename[10],MGraph G);
void ShortestPath(int v0);
void displaycity();
//全局变量
MGraph G;
int P[MAX_VERTAX_NUM][MAX_VERTAX_NUM];
long D[MAX_VERTAX_NUM];
void CreateUDN() //造图函数
{
char v1[20],v2[20],c;
int i,j,w;
printf("请输入城市数:");
scanf("%d",&G.vexnum);
printf("\n");
printf("请输入%d个城市:\n",G.vexnum);
for(i=0;i<G.vexnum;i++)
{
scanf("%s",G.vexs[i].city);
G.vexs[i].number=i;
}
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j].adj=INFINITY;
q: printf("输入要添加路线的两城市名:\n");
scanf("%s",v1);
scanf("%s",v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
printf("输入%s和%s之间的长度",v1,v2);
scanf("%d",&w);
G.arcs[j][i].adj=G.arcs[i][j].adj=w;
G.arcnum++;
printf("继续添加?(y\\n)");
scanf("%c",&c);
if(getchar()=='y')
goto q;
}
void displaycity() //显示城市
{
int i,k=0;
printf("\n****************城市列表如下**************\n\n");
for(i=0;i<G.vexnum;i++)
{
printf("(%2d)%-15s",i,G.vexs[i].city); //输出城市列表
if(++k%4==0) printf("\n");
}
}
void ShortestPath(int v0) //最短路径函数
{
int v,w,i,t;
int final[MAX_VERTAX_NUM];
int min;
for(v=0;v<G.vexnum;++v)
{
final[v]=FALSE;
D[v]=G.arcs[v0][v].adj;
for(w=0;w<G.vexnum;++w)
P[v][w]=FALSE;
if(D[v]<INFINITY)
{
P[v][v0]=TRUE;
P[v][v]=TRUE;
}
}
D[v0]=0;final[v0]=TRUE;
for(i=1;i<G.vexnum;++i)//error
{
min=INFINITY;
for(w=0;w<G.vexnum;++w)
if(!final[w])
if(D[w]<min){v=w;min=D[w];}
final[v]=TRUE;
for(w=0;w<G.vexnum;++w)
if(!final[w]&&((min+G.arcs[v][w].adj)<D[w]))
{
D[w]=min+G.arcs[v][w].adj;
for(t=0;t<25;t++) P[w][t]=P[v][t];
P[w][w]=TRUE;
}
}
}
void output(int city1,int city2) //输出函数
{
int a,b,d,q=0,c;
a=city2;
if(a!=city1)
{
printf("\n从%s到%s的最短路径是",G.vexs[city1].city,G.vexs[city2].city);
printf("(最短距离为 %dkm。)\n\t",D[a]);
printf("%s",G.vexs[city1].city);
d=city1;
for(c=0;c<G.vexnum;++c)
{
P[a][city1]=0;
for(b=0;b<G.vexnum;b++)
{
if(G.arcs[d][b].adj<INFINITY && P[a][b])
{
printf("-->%s",G.vexs[b].city);
P[a][b]=0;
d=b;
}
}
}
}
}
void Save(char filename[10],MGraph G){
FILE *fp;
if((fp=fopen(filename,"wb"))==NULL){
printf("cannot open file\n");
}//if
if(fwrite(&G,sizeof(struct MGraph),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}//Save
int LocateVex(MGraph G,char u[20])
{
int i;
for(i =0; i< G.vexnum;i++)
{
if(!strcmp(G.vexs[i].city,u))
return i;
}
return -1;
}
void main() //主函数
{
char v0[20],v1[20];
int i,j;
char filename[10];
FILE *fp;
S: printf("\t*******欢迎使用最优路径导航系统*******\n");
printf("\t* *\n");
printf("\t* 1.新建地图: *\n");
printf("\t* 2.打开已有地图: *\n");
printf("\t* 3.退出系统: *\n");
printf("\t* *\n");
printf("\t**************************************\n");
printf("请输入要执行的操作:");
switch(getchar())
{
case '1':
printf("请输入新建地图的文件名:");
p: scanf("%s",filename);
if(fp=fopen(filename,"rb"))
{
printf("该文件已存在,请重新输入其他名:");
fclose(fp);
goto p;
}
printf("\n");
CreateUDN();
Save(filename,G);
printf("\n");
break;
case '2':
printf("请输入文件名:");
R: scanf("%s",filename);
if((fp=fopen(filename,"rb"))==NULL){
printf("该文件不存在,请重新输入其他名:");
goto R;
}//if
printf("\n");
fp=fopen(filename,"rb");
fread(&G,sizeof(struct MGraph),1,fp);
break;
case '3':
exit(1);
break;
}
displaycity();
printf("\n\n输入出发城市和目的地:");
scanf("%s%s",v0,v1);
printf("\n");
i=LocateVex(G,v0);
j=LocateVex(G,v1);
ShortestPath(i);
output(i,j);
printf("\n\n");
printf("是否继续?(y\\n)");
getchar();
if(getchar()=='y')
{
goto S;
getchar();
}
fclose(fp);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?