YTU/*数据结构课设校园导航问题使用弗洛伊德算法*/

YTU/*数据结构课设校园导航问题使用弗洛伊德算法*/ 

ps:程序中有bug,我就不在这说了,qwq,这里没有分文件和都文件的形式,希望学弟们参考的时候,耗子尾汁。

/*
数据结构课设
校园导航问题
使用弗洛伊德算法
*/ 
#include<bits/stdc++.h>

using namespace std;

#define INF 1e8 //定一个最大值

struct v{ //顶点信息 
	int exist; //看顶点是否存在 存在则为1,不存在为0 
	char name[100];
	char valintroduce [1000] ;
}val[100]; //顶点编号即为数组下标

int total=9;//记录景点数 

int graph[100][100]={0};//先设置100个点,备用 备注:初始图,不能随意改动数据,刷新图操作在新图

int newgraph[100][100]={0}; //此图用于求最短路径

int path[100][100];

int dis[100][100]={0};

void IntializeVal(); //初始化顶点 

void IntializeGraph(); //初始化图 

void ChangeGraph(int flag); //修改图例如删除操作0:添加点同时添加相关边,1:删除点同时删除相关边,2:仅删除边,3:仅添加边(或者仅修改)

void updateGraph(); //newgraph 和 graph; 

void lookval();//查看景点信息

void lujing(int x,int y);//查看x,y的路径

void find(int x,int y);//查看距离

void Floyd(); //Floyd算法 

void print();   //  界面函数 

void printGraph();//输出newgraph图 

void find_allDisAndPath();// 查看一个景点到其它所有景点路径

void printpath();//path图 

void printdis(); //dis图 

int main(){
	
	system("color 06");
	
	IntializeVal();
	
	IntializeGraph();
	
	updateGraph();
	
//	printGraph();

	Floyd();
	
	while(true){
		
		print();
		
		char c;
		cin>>c;
		
		if(c == 'A'||c == 'a'){//查看景点信息
			lookval();
		}
		
		else if(c == 'B'||c == 'b'){//查询最短路径
			int x,y;
			
			printf("请输入查询的地点编号:");
			cin>>x>>y; 
			
			find(x,y);
		}
		
		else if(c == 'C'||c == 'c'){ //点边操作
		printf("请输入管理密钥:\n");
		char s[1000];
		cin>>s;
		char s1[1000]={"6666"};
		if(strcmp(s,s1) == 0 ){
			printf("0:添加点同时添加相关边,1:删除点同时删除相关边,2:仅删除边,3:仅添加边(或者仅修改),4:修改简介  其它任意键退出\n");
			
			int flag=-1;
			cin>>flag;
			
			ChangeGraph(flag);
			
			updateGraph();
			
			Floyd();
			
		}
		else{
			printf("输入错误,已退出\n");
		} 
				
		}
		else if(c == 'D'||c == 'd'){ //查看一个景点到其它所有景点路径
			find_allDisAndPath(); 
		}
		
		else if(c == 'E'||c == 'e'){
			break;	
		}
		
		else if(c == 'F'||c == 'f'){
			printf("请输入管理密钥:\n");
			char s[1000];
			cin>>s;
			char s1[1000]={"6666"};
			if(strcmp(s,s1) == 0 ){
				printpath();
			}
			else{
				printf("输入错误,已退出\n");
			}
			
		}
		
		else if(c == 'g'||c == 'G'){
			printf("请输入管理密钥:\n");
			char s[1000];
			cin>>s;
			char s1[1000]={"6666"};
			if(strcmp(s,s1) == 0 ){
				printdis();
			}
			else{
				printf("输入错误,已退出\n");
			}
				
		}
		else{
			printf("更多功能敬请期待\n");
		}	
		
	}
	
	return 0;
}
void IntializeGraph(){ //初始化图  

	graph[1][3]=100;graph[3][1]=100;
	
	graph[1][4]=200;graph[4][1]=200;
	
	graph[1][5]=100;graph[5][1]=100;
	
	graph[5][2]=200;graph[2][5]=200;
	
	graph[2][3]=50;graph[3][2]=50;
	
	graph[3][8]=500;graph[8][3]=500;
	
	graph[4][9]=200;graph[9][4]=200;
	
	graph[9][8]=700;graph[8][9]=700;
	
	graph[6][9]=graph[9][6]=500;
	
	graph[7][8]=graph[8][7]=100;
	
	graph[7][6]=graph[6][7]=100;
	
}
void IntializeVal(){ //初始化顶点 
	for(int i=0;i<100;i++){
		val[i].exist=0;
	}
	for(int i=1;i<=9;i++){
		val[i].exist=1;
	}
	//名称 
	strcpy(val[1].name,"土木工程学院");
	
	strcpy(val[2].name,"数院");
	
	strcpy(val[3].name,"外国语学院");
	
	strcpy(val[4].name,"化学院");
	
	strcpy(val[5].name,"生命科学院");
	
	strcpy(val[6].name,"三元湖");
	
	strcpy(val[7].name,"海洋学院");
	
	strcpy(val[8].name,"承先图书馆");
	
	strcpy(val[9].name,"计算机学院");

	//简介
	strcpy(val[1].valintroduce,"烟台大学土木工程学院的前身为烟台大学建筑工程系,创建于1984年。建筑工程系的创建与发展得到了清华大学土木工程系的大力支持。");
	
	strcpy(val[2].valintroduce,"烟台大学数学与信息科学学院始建于1984年,其前身是由北京大学和清华大学依据原国家教委的指示对口援建的烟台大学数学系。1989年,烟台大学数学系更名为烟台大学数学与信息科学系。2006年8月组建成立烟台大学数学与信息科学学院。");
	
	strcpy(val[3].valintroduce,"烟台大学外国语学院成立于1999年,由外语系和语言培训中心合并组建而成。外语系是烟台大学建校之初成立最早的院系之一,1985年开始招收本科生,1989年获学士学位授予权。外国语学院2001年获硕士学位授予权,2010年获批外国语言文学一级学科硕士学位授予权和翻译硕士专业学位授予权。");
	
	strcpy(val[4].valintroduce,"烟台大学化学化工学院前身为1984年由北京大学生物系和清华大学化工系分别援建的生物化学系和化学工程系,后经多次优化调整,办学规模不断扩大。");
	
	strcpy(val[5].valintroduce,"烟台大学生命科学学院前身为1985年由北京大学援建的生物化学系的生物化学、微生物学专业和清华大学援建的化工系的生物化工、食品科学工程专业组成,后经多次优化调整,相关学科在人才培养、科技创新及服务社会等方面取得突出成就,办学规模不断扩大。2011年春,经学校再次调整,将生物科学、生物技术、生物工程及食品科学与工程、食品质量与安全5个本科专业合并,新组建成生命科学学院,2018年经再次专业调整,暂停生物技术专业,新上生物制药专业。");
	
	strcpy(val[6].valintroduce,"三元湖南部为环湖南路,北部是环湖北路,西为教学路,东部以一小路与烟台大学足球场(外场)相望,湖的西南角有一个三面环水的半岛。");
	
	strcpy(val[7].valintroduce,"烟台大学海洋学院,其前身是成立于1951年的山东省水产学校,有着50多年的办学历史。1994年山东省水产学校与烟台大学联合建立了烟台大学水产学院;");
	
	strcpy(val[8].valintroduce,"承先图书馆坐落在北校区中间位置,位于三元湖北侧,距离西南门较近,始建于1986年,1989年投入使用,建筑面积为14300平方米,以印刷型文献外借服务为主。");
	
	strcpy(val[9].valintroduce,"1985年3月,清华大学计算机系援建烟台大学电子学与计算机科学系");
	
	 
} 
void ChangeGraph(int flag){ //修改图例如删除操作 0:添加点同时添加相关边,1:删除点同时删除相关边,2:仅删除边,3:仅添加边(或者仅修改) 4修改简介 
//同时也需要改val 
	if(flag == 1){
		
		printf("请输入需要删除的地点:(输 0 退出)");
		
		int n;
		cin>>n; 
		
		if(n==0){
			
		} 
		else if(val[n].exist == 1){
			
				val[n].exist=0;
				
				strcpy(val[n].name," ");
				
				strcpy(val[n].valintroduce," ");
				
			for(int i=0;i<9;i++){
				
				graph[n][i]=0;
				
				graph[i][n]=0;
			
			}
			
			printf("删除成功\n");
			
			}
			
		else{
			
				printf("该节点不存在,不需要删除。"); 
				
		}
		 
		
	} 
	else if(flag == 0){
		printf("请输入需要添加的地点:");
		char sname[100];
		cin>>sname;
		char svalintroduce[1000];
		printf("请输入简介:\n"); 
		cin>>svalintroduce; 
		int n;
		int flag=1;//如果前面有点空着,那就把点放这个位置 
		for(int i=1;i<=total;i++){
			if(val[i].exist==0){
				n = i;
				flag=0; 
				break;
			}
		} 
		//如果前面没有点空着,那就加位置 
		if(flag){
			total++;
			n=total;
		}
		val[n].exist=1;
		strcpy(val[n].name,sname);
		strcpy(val[n].valintroduce,svalintroduce);
		graph[n][n]=0;
//		if(val[n].exist == 0){
//			int k;
			printf("该点已添加,它的标号为:%d\n",n); 
//			printf("请输入有几条通往其它地点的路:\n");
			
//			cin>>k;
			while(1){
				printf("请输入该地点与其它地点的路径(如:1 2 200 表示1到2需要200米):\n");
				printf("如果不需要添加,请输入0 0 0 \n"); 
				int be,en,m;
				
				cin>>be>>en>>m;
				if(be==0&&en==0&&m==0){
					printf("已完成\n");
					break;
				} 
				if(be!=n){
					printf("起始地点应该是%d\n",n);
//					i--;
				}	
				else{
					if(val[en].exist==0){
						printf("%d地点不存在\n",en);
//						i--;
					}
					else if (m<=0){
						printf("距离不正确\n");
//						i--;
					} 
					else{
						graph[be][en]=graph[en][be]=m;
						printf("添加成功\n"); 
					}
				}
			} 		
//		}
		
	}
	else if(flag==2){
		printf("请输入你要删除的边,不需要添加请输入:0 0\n");
		int x,y;
		cin>>x>>y;
		if(x==0&&y==0){
			 
		} 
		else if(val[x].exist==0||val[y].exist==0){
			printf("%d 和 %d 存在点不存在\n");
		}
		else{
			if(graph[x][y]!=0){
				graph[x][y]=0;
				printf("删除完成\n");	
			} 
			else{
				printf("%d %s 到 %d %s 没有直达路径\n",x,val[x].name,y,val[y].name);
			}
			
		}
		 
	} 
	else if(flag==3){
		printf("请输入你要添加或修改的边和距离,不需要修改请输入: 0 0 0\n");
		int x,y,d;
		cin>>x>>y>>d;
		if(x==0&&y==0&&d==0){
			
		} 
		else if(d<=0){
			printf("距离不能小于等于0\n");
		}
		else if(val[x].exist==0||val[y].exist==0){
			printf("%d 和 %d 存在点不存在\n");
		}
		else if(x==y){
			printf("到达本身的距离应该是0,不能被修改\n");
		}
		else{
			graph[x][y]=d;
			printf("修改完成\n");	
		}
		
	}
	else if(flag==4){
		printf("如果需要退出请在这里输入 0,需要继续修改请输 1: ");
		int k=1;
		cin>>k;
		if(k==1){
			int kk;
			printf("请输入要修改的点的简介:\n");
			cin>>kk;
			if(val[kk].exist==1){
				printf("现在的简介: %s\n",val[kk].valintroduce);
				printf("想要修改成的简介:\n");
				char svalintroduce[1000];
				cin>>svalintroduce;
				strcpy(val[kk].valintroduce,svalintroduce);
				printf("修改修改成功\n");
			}
			else{
				printf("该点不存在,请先添加\n"); 
			}	
			
		}
		else{
			printf("已退出\n");
		}
	} 
	else {
		printf("已退出\n");
	}
}
void lookval(){
	for(int i=1;i<=total;i++){
		if(val[i].exist==1){
			printf("景点编号为 %d\n",i);
			printf("景点名称为 %s\n",val[i].name);
			printf("景点简介为 %s\n",val[i].valintroduce);
		}
	}
}
void updateGraph(){ //newgraph 和 graph; 
	for(int i=1;i<=total;i++){
		if(val[i].exist==1){
			for(int j=1;j<=total;j++){
				if(i==j){
					newgraph[i][j]=0;
				}
				else{
					if(graph[i][j]==0){
						newgraph[i][j]=INF;
					}
					else{
						newgraph[i][j]=graph[i][j];
					}
				}
			}
		}
		else{
			for(int j =1;j<=total;j++){
				newgraph[i][j]=INF;
			}
		} 
		
	}
	
}
void lujing(int x,int y){
	printf(" 最短路径为:");
	
	cout<<x<<": ";
	cout<<val[x].name<<") ";
	
	int l = path[x][y];
	
	cout<<l<<": ";
	cout<<val[l].name<<") ";
	
	while(l!=y){
		
		cout<<path[l][y]<<": "<<val[path[l][y]].name<<") ";
		l = path[l][y];
	}
	
}
void find(int x,int y){
	
	if(val[x].exist==1&&x==y){
		printf("你输入的是同一个地点\n");
	} 
	else if(val[x].exist==0||val[y].exist==0){
		printf("你输入的地点有误或不存在\n"); 
	}
	else if(val[x].exist==1&&val[y].exist==1){
//		printf("%d %s 到 %d %s 的最短距离为 %d",x,val[x].name,y,val[y].name,distance[x][y]);
		cout<<x<<" "<<val[x].name<<" 到"<<y<<" "<<val[y].name<<" 的距离为:"<<dis[x][y]; 
		lujing(x,y);
	}	
}
void Floyd(){ //Floyd算法 
	int x,y,z;// x,y,z分别表示出发点,目的地,新加入的点 
	
	for(x=1;x<=total;x++){
		
		for(y=1;y<=total;y++){
			dis[x][y]=newgraph[x][y];
			path[x][y]=y;
		}
		
	}
	for(z=1;z<=total;z++){
		
		for(x=1;x<=total;x++){
			
			for(y=1;y<=total;y++){
				
				if(dis[x][y]>(dis[x][z]+dis[z][y])){
					
					dis[x][y]=dis[x][z]+dis[z][y];
					path[x][y]=path[x][z];
				/* 如果新加入的点组成的路径小于最小路径,更新最小路径,
				并且将新加入的点加入最短路径中 */ 
				}
					
			}
			
		}	
		
	}
	
}
void print(){   //  界面函数
	printf("\n\n\n");
	printf("\t***********************************************\t\n");
	printf("\t*            烟台大学校园导航系统             *\t\n");
	printf("\t***********************************************\t\n");
	printf("\t*      A. 查看景点信息                        *\t\n");
	printf("\t*      B. 查询最短路径                        *\t\n");
	printf("\t*      C. 点边操作                            *\t\n");
	printf("\t*      D. 查看一个景点到其它所有景点路径      *\t\n");
	printf("\t*      E. 退出系统                            *\t\n");
	printf("\t*      F. 查看Path                            *\t\n");
	printf("\t*      G. 查看Dis                             *\t\n");
	printf("\t*      (PS:以下所有路径单位为m)               *\t\n");
	printf("\t***********************************************\t\n");
	printf("\n\n请选择你需要的功能,输入代号:\n");
}
void printGraph(){
	
	for(int i=1;i<=total;i++){
		
		for(int j=1;j<=total;j++){
			cout<<newgraph[i][j]<<" \t";
		}
		
		cout<<"\n"; 
	}
}
void printpath(){
	
	for(int i=1;i<=total;i++){
		
		for(int j=1;j<=total;j++ ){
			cout<<path[i][j]<<" ";
		}
		
		cout<<endl;
	}
}
void printdis(){
	
	for(int i=1;i<=total;i++){
		
		for(int j=1;j<=total;j++ ){
			cout<<dis[i][j]<<" ";
		}
		
		cout<<endl;
	}
}
void find_allDisAndPath(){
	printf("请输入您想查询的地点:"); 
	int  x;
	cin>>x;
	
	for(int i=1;i<=total;i++){
		
		if(val[i].exist==1&&i!=x){
			printf("%d %s 到 %d %s 的最短距离为 %d",x,val[x].name,i,val[i].name,dis[x][i]);
			lujing(x,i);
			cout<<endl;
		}
		
	}
} 


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值