为了防止以后可能需要又找不到
还是上传一下吧
内容注释写的比较清楚了
#include
#include
#include
#include
#define MAX_VEX 100
#define inf 100000
#define ERROR -1
#define OK 1
#define TRUE 1
#define FLASE 0
using namespace std;
typedef int Status;
typedef struct
{
char vexs[MAX_VEX][MAX_VEX]; //景点向量代号
char name[MAX_VEX][MAX_VEX];//景点名称
char ins[MAX_VEX][1000];//景点简介
int arcs[MAX_VEX][MAX_VEX]; //邻接矩阵
int vexnum;
int arcnum; //图的当前顶点数和弧数
} MGraph ; //图的结构定义
int locate(MGraph G,char c[]);//定位点
MGraph create();//创建无向图
void print(MGraph G);//打印邻接矩阵
void browse(MGraph G);//打印全部景点信息
void shortestd(MGraph G);//查看浏览路线
void shortestf(MGraph G);//查看浏览路线
void seeabout(MGraph G);//景点信息查询
void change(MGraph &G);//更改图的信息
void add(MGraph &G);//增加景点及边
void mi(MGraph &G);//减少景点及边
void reb(MGraph &G);//重建图
void allpath(MGraph G);//查询一条一次遍历所有景点的可行路径
int locate(MGraph G,char c[]){//定位
int i=0;
for(i=0;i<G.vexnum;i++){
if(strcmp(G.vexs[i],c)==0) return i;
}
return -1;
}
MGraph create(){//创建无向图
MGraph G;
int i=0,j=0,k=0;
char ch1[MAX_VEX],ch2[MAX_VEX];
int flag[2]={-1};
int weigh;
printf("请输入景点个数,边数:");
scanf("%d %d",&G.vexnum,&G.arcnum);
getchar();
while(i<G.vexnum){//输入景点代号以及信息
printf("请输入景点代号:");
scanf("%s",G.vexs[i]);
getchar();
printf("请输入景点名字:");
gets(G.name[i]);
printf("请输入景点简介:");
gets(G.ins[i]);
i++;
}
for(i=0;i<G.vexnum;i++){//初始化邻接矩阵
for(j=0;j<G.vexnum;j++){
G.arcs[i][j]=inf;
}
}
printf("请输入每条边依附的景点代号和距离:\n");//输入各点间关系
for(i=0;i<G.arcnum;i++){
scanf("%s",ch1);
getchar();
scanf("%s",ch2);
getchar();
scanf("%d",&weigh);
getchar();
flag[0]=locate(G,ch1);
flag[1]=locate(G,ch2);
G.arcs[flag[0]][flag[1]]=weigh;
G.arcs[flag[1]][flag[0]]=weigh;
}
//测试使用初始图
/*
G.vexnum=5;
G.arcnum=7;
char str1[5][100]={"a","b","c","d","e"};
char str2[5][100]={"图书馆","操场","食堂","池塘","教学楼"};
char str3[5][100]={"图书馆是收集、整理和保存文献资料并向读者提供利用的科学、文化、教育机构","操场是供体育锻炼用的场地,是学校进行体育活动和教学活动的专置场地","食堂是学校教职工用餐的地方","池塘是休闲放松的好地方","教学楼是学生们上课的地方"};
for(int i;i<5;i++){
strcpy(G.vexs[i],str1[i]);
strcpy(G.name[i],str2[i]);
strcpy(G.ins[i],str3[i]);
}
int a[5][5]={{inf,10,inf,30 ,100},{10, inf, 50 ,inf ,inf},{inf, 50, inf, 20 ,10},{30, inf ,20 ,inf, 60},{100, inf, 10 ,60 ,inf}};
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
G.arcs[i][j]=a[i][j];
}
}*/
return G;
}
void browse(MGraph G){//学校景点介绍
printf("景点代号\t景点名称\t景点简介\n");
printf("-------------------------------------------------------\n");
int i;
for(i=0;i<G.vexnum;i++){
printf("%s\t\t%s\t\t",G.vexs[i],G.name[i]);
puts(G.ins[i]);
}
}
void shortestd(MGraph G){//查看浏览路线
int i,j,k,n;
char v0[MAX_VEX];
printf("请输入起始景点代号:");//输入景点代号
scanf("%s",v0);
int v=locate(G,v0);//定位
if(v==-1){
printf("输入的代号错误\n");
return ;
}
int final[MAX_VEX]={0},d[MAX_VEX]={0};
int p[MAX_VEX];
for(i=0;i<G.vexnum;i++){
d[i]=G.arcs[v][i];
p[i]=v;//保存最短路径顶点上一个顶点
}
d[v]=0;//初始化
final[v]=1;
for(i=0;i<G.vexnum;i++){//主循环,每次求到另一个点的最短路径
int min=inf;
n=-1;
for(j=0;j<G.vexnum;j++){
if(!final[j]){
if(d[j]<min){
n=j;
min=d[j];
}
}
}
final[n]=1;
for(j=0;j<G.vexnum;j++){
if(!final[j]&&(min+G.arcs[n][j]<d[j])){
d[j]=min+G.arcs[n][j];
p[j]=n;
}
}
}
for(i=0; i<G.vexnum; i++)
{
int k = i;
// 顶点sv到其它顶点的路径
printf("从%s 到 %s的最短距离为 %d\n路径为",G.name[v],G.name[k], d[k]);
// 最短路径顶点关系
do
{
printf("%s -> ",G.name[k]);
k=p[k];
} while( k!= v);
printf("%s\n",G.name[k]);
}
}
void shortestf(MGraph G){//求两个景点之间的最短路径
int i,j,k;
char ch1[100],ch2[100];
int d[MAX_VEX][MAX_VEX];
int p[MAX_VEX][MAX_VEX];
printf("请输入起点和终点的景点代号:");
scanf("%s %s",ch1,ch2);
int v1=locate(G,ch1);
int v2=locate(G,ch2);
if(v1==-1||v2==-1){
printf("起始点代号错误\n");
return;
}
for(i=0;i<G.vexnum;i++){//初始化
for(j=0;j<G.vexnum;j++){
d[i][j]=G.arcs[i][j];
p[i][j]=j;
}
}
for(i=0;i<G.vexnum;i++){
for(j=0;j<G.vexnum;j++){
for(k=0;k<G.vexnum;k++){
if(d[j][k]>d[j][i]+d[i][k]){
d[j][k]=d[j][i]+d[i][k];
p[j][k]=p[j][i];
}
}
}
}
k=v1;
printf("从%s到%s的最短距离为%d\n路径为",G.name[v1],G.name[v2],d[v1][v2]);
printf("路径为:");
while(k!=v2){
printf("%s ->",G.name[v1]);
k=p[k][v2];
strcpy(ch1,G.name[k]);
}
printf("%s\n",G.name[v2]);
}
void seeabout(MGraph G){//景点信息查询
printf("请输入查询的景点代号:");
char str[100];
scanf("%s",str);
printf("景点代号\t景点名称\t景点简介\n");
printf("-------------------------------------------------------\n");
printf("%s\t\t",str);
int v=locate(G,str);//定位
printf("%s\t\t",G.name[v]);
puts(G.ins[v]);//打印
}
void add(MGraph &G){//增加景点个数和边
printf("请输入新添加的景点个数和边的条数:");
int n=5,m=7,p=G.vexnum,q=G.arcnum,weigh;
int flag[2]={-1};
int i=p,j,k;
char ch1[100],ch2[100];
scanf("%d %d",&n,&m);
G.vexnum+=n;
G.arcnum+=m;
getchar();
while(i<G.vexnum){//输入景点代号以及信息
printf("请输入景点代号:");
scanf("%s",G.vexs[i]);
getchar();
printf("请输入景点名字:");
gets(G.name[i]);
printf("请输入景点信息:");
gets(G.ins[i]);
i++;
}
for(i=0;i<G.vexnum;i++){
G.arcs[i][G.vexnum-1]=inf;
}
for(i=p;i<=G.vexnum;i++){
for(j=0;j<G.vexnum;j++){
G.arcs[i][j]=inf;
}
}
if(m==0) return ;
printf("请输入新增每条边依附的景点代号和距离:\n");//输入各点间关系
for(i=q;i<G.arcnum;i++){
scanf("%s",ch1);
getchar();
scanf("%s",ch2);
getchar();
scanf("%d",&weigh);
getchar();
flag[0]=locate(G,ch1);
flag[1]=locate(G,ch2);
G.arcs[flag[0]][flag[1]]=weigh;
G.arcs[flag[1]][flag[0]]=weigh;
}
print(G);
}
void mi(MGraph &G){// 减少景点个数和边
printf("请输入减少的景点个数和边的条数(不包括减少的景点所包含的路径):");
int n,m,t;
int flag[2]={-1};
int i,j,k,v[MAX_VEX];
char ch1[100],ch2[100];
scanf("%d %d",&n,&m);
getchar();
printf("请输入减少的景点代号:");
for(i=0;i<n;i++){
scanf("%s",ch1);
v[i]=locate(G,ch1);
for(j=v[i]+1;j<G.vexnum-i;j++){
strcpy(G.vexs[j-1],G.vexs[j]);
strcpy(G.ins[j-1],G.ins[j]);
strcpy(G.name[j-1],G.name[j]);
}
for(t=0;t<G.vexnum;t++){
for(j=v[i];j<G.vexnum-i-1;j++){
G.arcs[t][j]=G.arcs[t][j+1];
}
}
for(t=0;t<G.vexnum;t++){
for(j=v[i];j<G.vexnum-i-1;j++){
G.arcs[j][t]=G.arcs[j+1][t];
}
}
}
G.vexnum-=n;
G.arcnum-=m;
if(m!=0){
printf("请输入减少每条边依附的景点代号:\n");
for(i=0;i<m;i++){
scanf("%s",ch1);
getchar();
scanf("%s",ch2);
getchar();
flag[0]=locate(G,ch1);
flag[1]=locate(G,ch2);
G.arcs[flag[0]][flag[1]]=inf;
G.arcs[flag[1]][flag[0]]=inf;
}
}
print(G);
}
void reb(MGraph &G){//重建图
int i=0,j=0,k=0;
char ch1[MAX_VEX],ch2[MAX_VEX];
int flag[2]={-1};
int weigh;
printf("请输入景点个数,边数:");
scanf("%d %d",&G.vexnum,&G.arcnum);
getchar();
while(i<G.vexnum){//输入景点代号以及信息
printf("请输入景点代号:");
scanf("%s",G.vexs[i]);
getchar();
printf("请输入景点名字:");
gets(G.name[i]);
printf("请输入景点信息:");
gets(G.ins[i]);
i++;
}
for(i=0;i<G.vexnum;i++){//初始化邻接矩阵
for(j=0;j<G.vexnum;j++){
G.arcs[i][j]=inf;
}
}
printf("请输入每条边依附的景点代号和距离:\n");//输入各点间关系
for(i=0;i<G.arcnum;i++){
scanf("%s",ch1);
getchar();
scanf("%s",ch2);
getchar();
scanf("%d",&weigh);
getchar();
flag[0]=locate(G,ch1);
flag[1]=locate(G,ch2);
G.arcs[flag[0]][flag[1]]=weigh;
G.arcs[flag[1]][flag[0]]=weigh;
}
print(G);
}
void change(MGraph &G){//更改图的信息
printf("1.增加新的景点及边\n2.减少新的景点及边\n3.重建图\n");
int op;
printf("请输入操作:");
scanf("%d",&op);
switch(op){
case 1:add(G);break;
case 2:mi(G); break;
case 3:reb(G); break;
}
}
void allpath(MGraph G){//查询一条一次遍历所有景点的可行路径
char ch1[100];
int flag[100]={0},a[100],front,rear,i,j,p;
printf("\n请输入从哪个景点代号开始:");
scanf("%s",ch1);
front=rear=0;
i=locate(G,ch1);
a[rear++]=i;
flag[i]=1;
while(rear>front){
p=a[front++];
printf("%s ",G.name[p]);
for(j=0;j<G.vexnum;j++){
if(flag[j]==0&&G.arcs[p][j]!=inf){
flag[j]=1;
a[rear++]=j;
}
}
}
printf("\n");
}
void print(MGraph G){//打印邻接矩阵
int i,j;
printf("\n图的邻接矩阵为:\n");
printf(" \t");
for(i=0;i<G.vexnum;i++) printf("%s\t",G.name[i]);
printf("\n");
for(i=0;i<G.vexnum;i++){
printf("%s\t",G.name[i]);
for(j=0;j<G.vexnum;j++){
if(G.arcs[i][j]==inf) printf("∞\t");
else printf("%d\t", G.arcs[i][j]);
}
printf("\n");
}
}
int main(){
MGraph G=create();
while(1){
printf("------------------欢迎使用校园导游系统-------------------\n");
printf("\n 欢迎来到青岛大学\n");
printf("\n 菜 单 选 择\n");
printf("\n\t1.学校景点介绍\t\t2.查看游览路线\n");
printf("\t3.查询景点间最短路径\t4.景点信息查询\n");
printf("\t5.更改图信息\t \t6.查询一条一次遍历所有景点的可行路径\n");
printf("\t7.打印邻接矩阵\t\t8.退出\n");
printf("请输入您的选择:");
int op;
scanf("%d",&op);
switch(op){
case 1: browse(G);break;
case 2: shortestd(G);break;
case 3: shortestf(G);break;
case 4: seeabout(G);break;
case 5: change(G);break;
case 6: allpath(G);break;
case 7: print(G);break;
case 8: printf("退出系统\n");exit(0);break;
default: printf("命令错误请重新输入\n");break;
}
}
return 0;
}