#include<bits/stdc++.h>
#include<stdlib.h>
#include<windows.h>
#include<string>
#include<string.h>
#define MaxVertexNum 100
#define Never 100000
using namespace std;
typedef struct info
{
int num;//序号
char name[100];//名字
char features[200]; //简介
}VertexType;
//图的存储结构:
typedef int EdgeType;
typedef struct mp{
EdgeType Edge[MaxVertexNum][MaxVertexNum];
int vn, en;//点数,边数
VertexType Vexs[MaxVertexNum] = {
{0,"体检中心","体检用的地方"},{1,"操场","体育课,社团锻炼的地方"},
{2,"校门北口","挨着小吃街,叫北街"},{3,"银杏景观","秋天的拍照聚集地"},
{4,"餐厅","beautiful"},{5,"校门东口","啥也没有"},
{6,"图书馆","高调奢华,考试前爆满"},{7,"花园景观","有花有草"},
{8,"校门南口","正门"},{9,"信息学部","很厉害的样子"},
{10,"邯郸音乐厅","好活动,大活动都在那"},{11,"网计学院","别问,问就是nb"}
};
}MGraph;
MGraph SchoolMap;
int now=12;
int Distance[MaxVertexNum][MaxVertexNum]; //记录最短的路径
int Path[MaxVertexNum][MaxVertexNum]; // 记录路径
int Length[MaxVertexNum][MaxVertexNum];
void initLoading();
void Login(); //登录
void Admin(); //管理
void Visitor();//游客
void Inite( MGraph &G );//创建无向图
void GetVex(MGraph &G);
void InsertPath(MGraph &G);//加路径
void InsertVertex( MGraph &G);//添加点
void DeleteVertex( MGraph &G);//删除节点
void DeletePath( MGraph &G);//删除路
void search_All_The_Shotest(MGraph &G);
void search_Shotest(MGraph &G);
void showAll(MGraph &G);
void Modify(MGraph &G);
void Floyd(MGraph &G);
int main()
{
Floyd(SchoolMap);
initLoading();
}
void InsertVertex( MGraph &G)//加点
{
char newname[100];
char information[100];
getchar();
printf("\t请输入新节点点的信息:\n");
printf("新节点的名字和简介空格分隔\n");
scanf("%s%s",newname,information);
G.Vexs[now].num=now;
strcpy(G.Vexs[now].name,newname);
strcpy(G.Vexs[now].features,information);
printf("%s",G.Vexs[now].name);
printf("%s",G.Vexs[now].features);
G.vn++;
now++;
}
void Visitor()
{
Floyd(SchoolMap);
printf("\n\t\t****************************************");
printf("\n\t\t* *");
printf("\n\t\t* 1.查询景点信息 *");
printf("\n\t\t* *");
printf("\n\t\t* 2.查找某点到其他地方的最短路径 *");
printf("\n\t\t* *");
printf("\n\t\t* 3.查找两点的最短路径 4.退出 *");
printf("\n\t\t* *");
printf("\n\t\t****************************************");
int choice=0;
showAll(SchoolMap);
while(1)
{
printf("\n\t\t输入功能选项>>>>>>>>>>>>:");
scanf("%d",&choice);
switch(choice)
{
case 1:GetVex(SchoolMap);break;
case 2:search_All_The_Shotest(SchoolMap);break;
case 4:exit(0);break;
case 3:search_Shotest(SchoolMap);break;
default:printf("重新输入:\n");
}
}
}
void GetVex(MGraph &G)
{
char The_name[100];
printf("请输入要查询的地方的名称:>>>:");
scanf("%s",The_name);
getchar();
int i,yes=0;
printf("\t序号\t\t名称\t\t\t简****************介\n\n");
for(i=0;i<G.vn;++i)
{
if(strcmp(The_name,G.Vexs[i].name)==0)
yes=1,printf("\t%d\t\t%s\t\t\t%s\n\n\n",i,G.Vexs[i].name,G.Vexs[i].features);
}
if(yes==0)
printf("failed! 结束\n");
else
printf("success! 结束\n");
}
void Admin()
{
printf("\t\t***用户登录***\n\n");
FILE *fp=fopen("pwd.config","r");
if(fp == NULL)
printf("因为文件损坏,不存在管理员用户"),Visitor(),exit(0);
int len=0;
int first=1;
char buf[1024];
char fusername[1024];
char fpassword[1024];
while( fgets( buf, 1024, fp) != NULL )
{
len = strlen(buf);
buf[len-1] = '\0'; /*去掉换行符*/
if(buf[0]=='\0')break;
// printf("%s %d \n",buf,len - 1);
if(first==1)printf("\t\t本地用户名读取成功\n\n"),first=2,strcpy(fusername,buf);
else printf("\t\t密码读取成功\n\n"),strcpy(fpassword,buf);
}
int count=3;
char username[1000];
char password[1000];
while(count--)
{
printf("请输入用户名&密码:\n\n");
printf("............用户名:>>>>>:");
gets(username);
printf("............密 码:>>>>>:");
gets(password);
if(strcmp(fusername,username)==0&&strcmp(fpassword,password)==0)
{
printf("登录成功,3秒钟后跳转"),Sleep(3000);break;
}
}
if(count==0)printf("输入错误超过三次,自动切换为游客模式"),Visitor(),exit(0);
showAll(SchoolMap);
printf("\n\t\t****************************************");
printf("\n\t\t* 1.增加景点信息 2.删除景点信息 *");
printf("\n\t\t* *");
printf("\n\t\t* 3.更改景点信息 4.查询景点信息 *");
printf("\n\t\t* *");
printf("\n\t\t* 5.增加道路 6.删除道路 *");
printf("\n\t\t* *");
printf("\n\t\t* 7.某点到其他点的最短路径 *");
printf("\n\t\t* *");
printf("\n\t\t* 8.浏览景点信息 9.退出 *");
printf("\n\t\t* 0.某点到某点的最短 *");
printf("\n\t\t****************************************\n\n");
int choice=0;
while(1)
{
Floyd(SchoolMap);
printf("\n\t\t选择功能:>>>>>>>>>>>>:");
scanf("%d",&choice);
switch(choice)
{
case 1:InsertVertex(SchoolMap);break;
case 2:DeleteVertex(SchoolMap);break;
case 3:Modify(SchoolMap);break;
case 4:GetVex(SchoolMap);break;
case 5:InsertPath(SchoolMap);break;
case 6:DeletePath(SchoolMap);break;
case 7:search_All_The_Shotest(SchoolMap);break;
case 8:showAll(SchoolMap);break;
case 9:exit(0);break;
case 0:search_Shotest(SchoolMap);break;
default:;
}
}
}
void InsertPath(MGraph &G)//加边
{
showAll(SchoolMap);
int N=0;
printf("请输入要添加的边数目>>>:");
scanf("%d",&N);
int x,y,len;
while(N--)
{
printf("请输入要加入路径的两个编号,以空格分隔,如:2 3 100\n");
scanf("%d %d %d",&x,&y,&len);
if(x<G.vn&&y<G.vn)
{
Length[x][y]=Length[y][x]=len;
G.en++;
printf("success\n");
} else{
printf("添加失败,输入了不存在的序号\n");
}
}
printf("添加路径结束\n");
system("pause");
}
void DeletePath( MGraph &G)
{
showAll(SchoolMap);
int N=0;
printf("请输入要删除的边数目>>>:");
scanf("%d",&N);
int x,y,len;
while(N--)
{
printf("请输入要删除路径的两个编号,以空格分隔,如:2 3 100\n");
scanf("%d %d %d",&x,&y,&len);
if(x<G.vn&&y<G.vn)
{
Length[x][y]=Length[y][x]=Never;
G.en++;
printf("success\n");
} else{
printf("删除失败,输入了不存在的序号\n");
}
}
printf("删除路径结束\n");
system("pause");
system("cls");
}
void Modify(MGraph &G){//修改景点信息
showAll(SchoolMap);
char newName[100];
char newinfo[100];
showAll(SchoolMap);
int N=0;
printf("\t输入要修改的节点数目>>:");scanf("%d",&N);getchar();
while(N--)
{
printf("\t请输入要修改的序号和简介,以空格分隔>>>>");
int number;
scanf("%d%s",&number,newinfo);
getchar();
if(G.vn>number)
{
strcpy(G.Vexs[number].features,newinfo);
printf("\t修改完毕\n\n");
}else
{
printf("\t不存在\n\n");
}
}
printf("\n\n\t修改节点信息结束按任意键回到初始界面\n");
system("pause");
//system("cls");
}
void DeleteVertex( MGraph &G)
{
int N=0;
printf("\t请输入要删除的点的数目>>>:");
scanf("%d",&N);
int x,i,j;
int count=0;
printf("\t请输入要删除的点的编号,回车符结束,如:2\n\n");
scanf("%d",&x);
count=0;
if(x<G.vn)
{
for(i=x;i<G.vn-1;++i)
{
for(j=0;j<G.vn;++j)
{
if(Length[x][j]<Never)count++;
Length[j][i]=Length[i][j]=Length[i+1][j];
}
}
for(i=0;i<G.vn;++i)
{
for(j=x;j<G.vn-1;++j)
{
Length[i][j]=Length[j][i]=Length[i][j+1];
printf("123");
}
}
for(i=x;i<G.vn-1;++i)
{
G.Vexs[i].num = G.Vexs[i+1].num;
strcpy(G.Vexs[i].name, G.Vexs[i+1].name);
strcpy(G.Vexs[i].features, G.Vexs[i+1].features);
}
G.en-=count;
G.vn-=1;
printf("success\n");
}else{
printf("添加失败,输入了不存在的序号\n");
}
printf("删除结束,按任意键回到初始界面\n");
system("pause");
//system("cls");
}
void initLoading()//初始话加载
{
int i=0;
printf("加载中");
for(i=0;i<10;++i)
printf("******"),Sleep(120);
system("cls");
printf("\n\n\n");
printf("\t Welcome,Welcome,Welcome,Welcome!...................作者:一个刚刚学数据结构的web菜汪:何止\n\n");
printf("\t へ /|\n");
printf("\t / \ ∠Z/\n");
printf("\t / Z │ / /\n");
printf("\t / Z _,< / /\\ヽ\n");
printf("\t │ ヽ\ / /〉\n");
printf("\t Y \\ / / /\n");
printf("\t ィ● 、 ● \\〈/\n");
printf("\t () へ () \〈\n");
printf("\t \>--___--ィ│/\n");
printf("\t /へ/ / |\\\n");
printf("\t /ヽ_/ (_/ │/\n");
printf("\t 7 \\ \\ \n");
printf("\t (>>―- ̄ ̄`-―_) \n");
printf("\n");
Inite(SchoolMap);//初始话
printf("\n\n\n\t...加载完毕............................ 画了一下午求多给两分叭!\n\n\n");
printf("\t即将进入登录阶段\t");
system("pause");
printf("\t");
system("cls");
Login();
}
void Login()
{
int choic = -1;
printf("\t选择登录方式:1.管理员登录\t\t2.游客登录\n");
printf("\n");
printf("\t 0.退出\n\n\n\n");
while(1)
{
printf("\t>>>>>>>>>>>>:");
scanf("%d",&choic);
getchar();
// printf("你输入了%d\n",choic);
switch(choic)
{
case 1:Admin();break;
case 2:Visitor();break;
case 0:exit(0);break;
default:break;
}
}
}
void showAll(MGraph &G)
{
int i=0;
int count=0;
printf("now=%d VN=%d\n",now,G.vn);
printf("\t序号\t\t名称\t\t\t简****************介\n\n");
for(i=0;i<G.vn;++i)
{
Sleep(110);
printf("\t%d\t\t%s\t\t\t\t%s\n\n",count++,G.Vexs[i].name,G.Vexs[i].features);
}
printf("\n\t*****End!******\n");
}
void Inite(MGraph &G)
{
G.vn = 12; //顶点数
G.en = 20; //边数
int i,j;
for (i = 0; i < MaxVertexNum; i++)//全部设置**正无穷**
{
for (j = 0; j < MaxVertexNum; j++)
{
G.Edge[i][j] = Never;
}
}
Length[0][1] = Length[0][1]=200;
Length[0][4] = Length[4][0]=350;
Length[1][2] = Length[2][1]=500;
Length[1][3] = Length[3][1]=500;
Length[1][4] = Length[4][1]=480;
Length[1][5] = Length[5][1]=400;
Length[2][7] = Length[7][2]=400;
Length[3][6] = Length[6][3]=100;
Length[3][7] = Length[7][3]=400;
Length[4][5] = Length[5][4]=280;
Length[4][8] = Length[8][4]=200;
Length[5][6] = Length[6][4]=100;
Length[5][9] = Length[9][5]=300;
Length[6][7] = Length[7][6]=500;
Length[6][9] = Length[9][6]=200;
Length[7][9] = Length[9][7]=100;
Length[8][10] = Length[10][8]=300;
Length[8][11] = Length[8][11]=100;
Length[9][10] = Length[10][9] = 100;
Length[10][11] = Length[11][10]=100;
//建立边的关系
int temp;
for (i = 0; i < G.vn; i++)
{
for (j = 0; j < G.vn; j++)
{
if(Length[i][j]!=0 || Length[j][i]!=0)
{
if(Length[i][j] != 0)
{
temp = Length[i][j];
}
else
{
temp = Length[j][i];
}
G.Edge[i][j] = temp;
G.Edge[j][i] = temp;
}
}
}
// //查看这个无向图
// for(i=0;i<G.vn;i++)
// {
// for(j=0;j<G.vn;j++)
// {
// printf("%d\t",G.Edge[i][j]);
// }
// printf("\n");
// }
}
void Floyd(MGraph &G)
{
int i,j,k;
for(i = 0; i < G.vn; i++)
{
for(j = 0; j < G.vn;j++)
{
Distance[i][j] = G.Edge[i][j];
Path[i][j] = j;
}
}
//Floyd算法
for(k = 0; k < G.vn; k++)
{
for(i = 0; i < G.vn; i++)
{
for(j = 0; j < G.vn; j++)
{
if(Distance[i][j] > Distance[i][k] + Distance[k][j])
{
Distance[i][j] = Distance[i][k] + Distance[k][j];
Path[i][j] = Path[i][k];
}
}
}
}
}
int Locate(MGraph *G,char Name[])//查找地点编号
{
int i;
for ( i= 0; i < G->vn; i++)
{
if( strcmp(G->Vexs[i].name,Name)==0 )//若含有该地点,则返回其编号
{
return i+1;
}
}
return -1; //若不存在该地地点,返回-1
}
//查询某一地点到其他所有地点的的最短路径
void search_All_The_Shotest(MGraph &G)
{
int start = -2;
char Name[100];
while(start == -2)
{
printf("请输入查询地点名称>>>:");
getchar();
gets(Name);
if(strlen(Name)>0)
{
start = Locate(&G,Name)-1;
printf("%s %s %d\n\n",Name,G.Vexs[start].name,start);
}
if(start==-2)
{
printf("不存在此地\n");
}
}
int i,j,k;
for(i = 0; i < G.vn; i++)
{
for(j = 0; j < G.vn;j++)
{
Distance[i][j] = G.Edge[i][j];
Path[i][j] = j;
}
}
//Floyd算法
for(k = 0; k < G.vn; k++)
{
for(i = 0; i < G.vn; i++)
{
for(j = 0; j < G.vn; j++)
{
if(Distance[i][j] > Distance[i][k] + Distance[k][j])
{
Distance[i][j] = Distance[i][k] + Distance[k][j];
Path[i][j] = Path[i][k];
}
}
}
}
//输出
for(j = 0; j < G.vn; j++)
{
if(j != start && G.Vexs[j].num != -1)
{
printf("从%s到%s的距离是:%d,",G.Vexs[start].name,G.Vexs[j].name,Distance[start][j]);
k = Path[start][j];
cout << "路径为:" << G.Vexs[start].name;
while(k != j)
{
printf(" ->%s ",G.Vexs[k].name);
k = Path[k][j];
}
printf(" ->%s \n\n",G.Vexs[j].name );
}
}
printf("操作完毕.....按任意键返回\n");
system("pause");
}
void search_Shotest(MGraph &G)
{
int start,end,k;
int flag=0;
printf("\t请输入起点和终点,空格分隔\n\t>>>:");
scanf("%d%d",&start,&end);
if(start<60&&end<60&&Distance[start][end]>0)
{
if(end!=start&&strlen(G.Vexs[end].name)>0&&end>=0&&start>=0)
{
printf("从%s到%s的距离是:%d,",G.Vexs[start].name,G.Vexs[end].name,Distance[start][end]);
k = Path[start][end];
cout << "路径为:" << G.Vexs[start].name;
while( k != end)
{
printf(" ->%s ",G.Vexs[k].name);
k = Path[k][end];
}
printf(" ->%s \n\n",G.Vexs[end].name );
}else
{
printf("不存在路径,不能到达\n\n");
}
system("pause");
} else
{
printf("不存在路径,不能到达\n\n");
}
}
root
flag{1amh3zhi}