数据结构实验三 图的应用知识讲解
数据结构实验三图
的应用
数据结构实验三图的应用(代码&测试界面)//Traffic_Inquiry.h
#include
#include
#define FINITY 999 //用999代表无穷大
#define M 20 //城市最大个数
typedef struct { //邻接矩阵类型定义
char name[8];
}CityNode; //城市信息结点的结构体(顶点值类型)
typedef int distype; //权值类型-距离
typedef int costype; //权值类型-费用
typedef struct {
CityNode citys[M]; //顶点信息域
distype dis[M][M]; //领接矩阵-距离
costype cos[M][M]; //邻接矩阵-费用
int n, e; //图中顶点总数与边数
}Mgraph;
//建立图的邻接矩阵存储结构
void CreateGraph(Mgraph *g)
{
int i, j, k;
double d, c;
printf("请输入城市数与路径数:");
scanf("%d %d",&g->n, &g->e);
for(i=0; i
printf("请输入第%d个城市名称:",i);
scanf("%s",g->citys[i].name);
}
for(i=0; i
for(j=0; j
if(i==j) {
g->dis[i][j]=0;
g->cos[i][j]=0;
}
else {
g->dis[i][j]=FINITY;
g->cos[i][j]=FINITY;
}
}
}
printf("\n城市名称录入完毕,录入结果:\n\t");
for(i=0; i
printf("%d->%s\t",i,g->citys[i].name);
}
printf("\n录入路径的权值信息,示例:0 1 34 40");
printf("代表%s到%s的距离为34千米,费用为40元\n",g->citys[0].name,g->citys[1].name);
for(k=0; k
scanf("%d %d %lf %lf",&i, &j, &d, &c);
g->dis[i][j]=g->dis[j][i]=d;
g->cos[i][j]=g->cos[j][i]=c;
}
}
//Dijkstra算法求解单源最短路径
typedef enum{FALSE,TRUE} boolean; //FALSE为0,TRUE为1
void dijkstra(Mgraph g, int v0,const int q) //函数参数:图的领接矩阵g;源点v0;
{
int d[M];//权值(距离或费用)向量类型
int p[M];//路径类型
boolean final[M]; //表示当前元素是否已经求出最短路径
int i,k,v,min;
//第一步,初始化集合s与距离向量d
for (v=0; v { final[v]=FALSE; if(q) d[v]=g.dis[v0][v]; else d[v]=g.cos[v0][v]; if (d[v] p[v]=v0; else p[v]=-1; //v无前驱 } final[v0]=TRUE; d[v0]=0; //初始时s中只有v0一个结点 //第二步,依次找出n-1个结点加入s中 for(i=1; i { min=FINITY; for(k=0;k if(!final[k]&&d[k] { v=k;min=d[k]; } if(min if(q) printf("[ %s ]到[ %s ]的最短距离为:%d千米 \n",g.citys[v0].name,g.citys[v].name,min); else printf("[ %s ]到[ %s ]的最小费用为:%d元 \n",g.citys[v0].name,g.citys[v].name,min); } else if(min==FINITY) return; final[v]=TRUE; //v加入S //第三步,修改V-S中各节点的距离 for(k=0;k if(!final[k]&&(min+g.dis[v][k] { d[k]=min+g.dis[v][k]; p[k]=v; } } } void floyd(Mgraph g,int q) //Floyd方法求所有顶点对间的最短路径(q用于判断参与算法的是距离还是费用) { int e[M][M]; //权值(距离或费用)向量类型 int p[M][M]; //路径类型 int i, j, k; if(q) memcpy(e,g.dis,M*M*sizeof(int)); else memcpy(e,g.cos,M*M*sizeof(int)); for(i=0;i for(j=0;j { if(i!=j && e[i][j] else p[i][j]=-1; } for(k=0;k { for(i=0;i for(j=0;j { if(e[i][j]>(e[i][k]+e[k][j])) { e[i][j]=e[i][k]+e[k][j]; p[i][j]=k; } } } printf("┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄\n"); for(i=0;i for(j=0;j if(i!=j&&e[i][j]!=0&&e[i][j] if(q) printf("[ %s ]到[ %s ]的最短距离为:%dkm。\n",g.citys[i].name,g.citys[j].name,e[i][j]); else printf("[ %s ]到[ %s ]的最小费用为:%d元。\n",g.citys[i].name,g.citys[j].name,e[i][j]); } printf("┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄\n"); } } void refer(Mgraph g, int *v0){ for(int i=0; i printf("%d->%s\t",i,g.citys[i].name); } printf("\n请输入查询城市序号:"); scanf("%d",v0); if(!(*v0 printf("你的输入有误!\n"); refer(g,v0); } } int menu () { int set; printf("\t ╔═════╗\n"); printf("\t ╔═════╣操作目录╠═════╗\n"); printf("\t╓┃╚═════╝┃\n"); printf("\t 欢┃⊙1.查询某地到它市最短路径┃\n"); printf("\t 迎┃┃\n"); printf("\t 使┃⊙2.查询某地到它市最小费用┃\n"); printf("\t 用┃┃\n"); printf("\t 交┃⊙3.显示各大城市间最短路径┃\n"); printf("\t 通┃┃\n"); printf("\t 查┃⊙4.显示各大城市间最小费用┃\n"); printf("\t 询┃┃\n"); printf("\t 系┃⊙5.进入管理员模式修改数据┃\n"); printf("\t 统┃┃\n"); printf("\t ╜┃⊙6.退出交通查询及管理系统┃\n"); printf("\t ┃┃\n"); printf("\t ╚═════════════════╝\n"); printf("\n请根据你的需求选择操作:"); scanf("%d",&set); printf("\n"); return set; } //main.c #include #include #include #include "Traffic_Inquiry.h" int main() { int v0; int set=1; Mgraph g; { //默认交通图 g.n=8; g.e=11; for(int i=0; i for(int j=0; j if(i==j) { g.dis[i][j]=0; g.cos[i][j]=0; } else { g.dis[i][j]=FINITY; g.cos[i][j]=FINITY; } } } strcpy(g.citys[0].name,"太原"); strcpy(g.citys[1].name,"成都"); strcpy(g.citys[2].name,"上海"); strcpy(g.citys[3].name,"北京"); strcpy(g.citys[4].name,"深圳"); strcpy(g.citys[5].name,"重庆"); strcpy(g.citys[6].name,"杭州"); strcpy(g.citys[7].name,"厦门"); g.cos[0][1]=g.cos[1][0]=99; g.dis[0][1]=g.dis[1][0]=19; g.cos[0][3]=g.cos[3][0]=12; g.dis[0][3]=g.dis[3][0]=51; g.cos[1][2]=g.cos[2][1]=54; g.dis[1][2]=g.dis[2][1]=14; g.cos[1][7]=g.cos[7][1]=123; g.dis[1][7]=g.dis[7][1]=13; g.cos[2][4]=g.cos[4][2]=201; g.dis[2][4]=g.dis[4][2]=61; g.cos[2][7]=g.cos[7][2]=15; g.dis[2][7]=g.dis[7][2]=25; g.cos[3][6]=g.cos[6][3]=77; g.dis[3][6]=g.dis[6][3]=77; g.cos[3][5]=g.cos[5][3]=45; g.dis[3][5]=g.dis[5][3]=15; g.cos[4][5]=g.cos[5][4]=14; g.dis[4][5]=g.dis[5][4]=17; g.cos[7][6]=g.cos[6][7]=25; g.dis[7][6]=g.dis[6][7]=87; g.cos[7][5]=g.cos[5][7]=66; g.dis[7][5]=g.dis[5][7]=12; } while(set){ switch(menu()){ case 1:refer(g,&v0);dijkstra(g,v0,1);break; case 2:refer(g,&v0);dijkstra(g,v0,0);break; case 3:floyd(g,1);break; //距离 case 4:floyd(g,0);break; //费用 case 5:CreateGraph(&g);break; case 6:set=0;printf("\t\t\t\t欢迎下次使用!\n");break; default:printf("无该选项对应的操作!\n");