sxy.h
#include
#include
#include
#include
#define M 100
#define INF 999666333
using namespace std;
struct Matrix
{
string Sname;//景区名称,为了解决哈希冲突
int count;//景点总数量
int edge;//道路数量
int m[M][M];//景点邻接矩阵
string Pname[M];//各个景点的名称
};
struct Scenic
{
Scenic(): next(NULL){}
Matrix mat;
struct Scenic *next;
};
int hash(string name);
void Welcome();//欢迎界面
void create_graph();//创建景区景点图
void print_graph();//输出景点分布(邻接矩阵的形式输出)
void DFS(int c,struct Scenic *p);//深度优先搜索导游线路
void guide_line();//导游线路
void dfs(int i,struct Scenic *p);//递归实现
void check_circuit();//判断回路
void Floyd(int a,int b,struct Scenic *&p);//Floyd算发求最短路
void min_distance();//最短路径、距离
void prime(struct Scenic *&p,string name);//最小生成树(prime算法)
void build_road();//道路修建规划图、
void scenic_message();//浏览所有景区景点信息
void change_sceic_name(struct Scenic *&p);//修改景点名称;
void change_weight(struct Scenic *&p);//修改该景区某条道路上的权值
void increase_number(struct Scenic *&p);//增加该景区小路的数量
void change_information();//修改景区景点信息
void MainFace();//主界面
void returnMainFace();//返回主界面
sxy.cpp
#include
#include
#include
#include
#include
#include
#include
#include//getch
#include//清屏函数头文件
#define l 1<<10
#define mod (1<<10)-1
#include "sxy.h"
using namespace std;
Scenic S[10000];
//用哈希表的形式进行建立查找景区名称地址
int hash(string name)
{
int key=0,t=name.size();
for(int i=0;i>name;
getchar();
key=hash(name);
Scenic *p=new Scenic,*q=new Scenic;
q=S[key].next;
while(q)//不为空时说明该位置存在景区(ASCII可以相同)
{
if(q->mat.Sname==name)//名称不能相同,才可以输入景区
{
cout<<"该景点名称已存在,重新输入景点名称: ";
cin>>name;
getchar();
key=hash(name);
q=S[key].next;
break;
}
else
q=q->next;
}
delete q;
p->mat.Sname=name;
//包含文件操作
outFile<<"*****************************************************************"<>p->mat.count;
outFile<<"该景区的景点总数目为:"<mat.count<>p->mat.edge;
outFile<<"该景区的道路数目为:"<mat.edge<mat.m,0,sizeof(p->mat.m));
for(i=1;i<=p->mat.edge;i++)
{
cout<<"\n*第 "<>n1;
outFile<<"************************第"<>p->mat.Pname[n1];
outFile<<"景点编号为"<mat.Pname[n1]<>n2;
cout<<"\t-景点 2 名称:";cin>>p->mat.Pname[n2];
outFile<<"景点编号为"<mat.Pname[n2]<>p->mat.m[n1][n2];
outFile<mat.Pname[n1]<<"和"<mat.Pname[n2]<<"之间的直接道路长度是"<mat.m[n1][n2]<mat.m[n2][n1]=p->mat.m[n1][n2];
}
p->next=S[key].next;
S[key].next=p;
cout<<"\n*景区创建成功!";
outFile.close(); //关闭文件
returnMainFace();
}
//输出景点分布(邻接矩阵的形式输出)
void print_graph()
{
string name;
int key,tag=1;
Scenic *p;
cout<<"*景区名称:"<>name;
getchar();
key=hash(name);
p=S[key].next;
if(p==NULL)
cout<<"\n*景区景点分布图为"<mat.Sname==name)//找到的地址不为空,只有名字相同时才,进行输出有关信息
{
cout<<"*************查询景区名称为 "<mat.count;++i)
{
cout<<"景点名称 "<mat.Pname[i];
for(int j=1;j<=p->mat.count;++j)
cout<<' '<mat.m[i][j];
cout<next;
}
if(tag)
cout<<"\n*景区景点分布图为"<mat.count)
{
cout<mat.Pname[c]<mat.Pname[c]<<" --> ";
visited[c]=1;
for(int i=1;i<=(p->mat.count);i++)
{
if(p->mat.m[c][i]>0&&!visited[i])
{
DFS(i,p);
if(p->mat.count>np)
{
cout<mat.Pname[c]<<"-->";
}
}
}
if(np==p->mat.count)
returnMainFace();
}
//导游线路
void guide_line()
{
//checked();
Scenic *p;
int key,c,tag=1;
cout<<"\n*请输入对应景区的名称:";
string name;
cin>>name;
getchar();
key=hash(name);
p=S[key].next;
if(p==NULL)
cout<<"\n*景区景点分布图(邻接矩阵表示)查询不存在!\n";
else
{
while(p)
{
if(p->mat.Sname==name)
{
memset(visited,0,sizeof(visited));
np=0;
cout<<"输入对应景点的编号"<>c;
cout<<"*形成的导游线路图(采用深度优先策略)如下所示:\n\n\t";
DFS(c,p);
tag=0;
break;
}
else
p=p->next;
}
if(tag)
cout<<"\n*景区景点分布图为"<mat.count;j++)
{
if(p->mat.m[i][j]!=0&&vis[j]==0)
dfs(j,p);
}
}
//判断回路
void check_circuit()
{
int key,tag=1;
Scenic *p;
string name;
cout<<"*景区名称:"<>name;
getchar();
key=hash(name);
p=S[key].next;
if(p==NULL)
cout<<"\n*景区景点分布图查询不成功!\n";
else
{
while(p)
{
if(p->mat.Sname==name)
{
memset(vis,0,sizeof(vis));//初始化vis数组,表示一开始所有顶点都未被访问过
DFS_Count=0;
for(int i=1;i<=p->mat.count;i++)//深度优先搜索
{
if(vis[i]==0)//如果这个顶点为被访问过,则从i顶点出发进行深度优先遍历
{
DFS_Count++;//统计调用void dfs(int i);的次数
dfs(i,p);
}
}
if(p->mat.edge+DFS_Count>p->mat.count)//遍历结束,若联通的数量个数加上边的数量个数>节点的数量个数,就判定为有环
cout<<"该景区中存在环"<next;
}
if(tag)
cout<<"\n*景区景点分布图查询不成功!\n";
}
returnMainFace();
}
//Floyd算发求最短路
void Floyd(int a,int b,struct Scenic *&p)
{
int i,j,k;
int A[M][M],path[M][M];
for(i=1;i<=p->mat.count;i++)//对进行求最短路的矩阵进行处理
{
for(j=1;j<=p->mat.count;j++)
{
if(p->mat.m[i][j]==0&&i!=j)
A[i][j]=INF;
else if(i==j)
A[i][j]=0;
else
A[i][j]=p->mat.m[i][j];
if(i!=j&&p->mat.m[i][j]mat.count;k++)
{
for(i=1;i<=p->mat.count;i++)
{
for(j=1;j<=p->mat.count;j++)
{
if(A[i][j]>A[i][k]+A[k][j])
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=path[k][j];
}
}
}
}
int apath[M],d;
if(A[a][b]mat.Pname[a]<<" 到 "<mat.Pname[b]<<" 的最短路径为:";
k=path[a][b];
d=0;
apath[d]=b;
while(k!=-1&&k!=a)//循环实现记录对应的节点编号
{
d++;
apath[d]=k;
k=path[a][k];
}
d++;
apath[d]=a;
cout<mat.Pname[apath[d]];
cout<=0;s--)//输出节点名称
{
cout<<" --> "<mat.Pname[apath[s]];
cout<<','<>name;
getchar();
key=hash(name);
p=S[key].next;
if(p==NULL)
cout<<"\n*景区分布图查询不成功!\n";
else
{
while(p)
{
if(p->mat.Sname==name)
{
cout<<"*******下面为该景区的一些信息:"<mat.Sname<mat.count;++i)
{
cout<<"编号为 "<mat.Pname[i];
for(int j=1;j<=p->mat.count;++j)
cout<<' '<mat.m[i][j];
cout<>a;
getchar();
cout<<"\t-景点 2:";
cin>>b;
getchar();
Floyd(a,b,p);
tag=0;
break;
}
else
p=p->next;
}
if(tag)
cout<<"\n*景区景点分布图查询不成功!\n";
}
returnMainFace();
}
void prime(struct Scenic *&p,string name)
{
int A[M][M],a,b,tag=1;
while(p)
{
if(p->mat.Sname==name)
{
for(int i=1;i<=p->mat.count;i++)
{
for(int j=1;j<=p->mat.count;j++)
{
if(p->mat.m[i][j]==0&&i!=j)
A[i][j]=INF;
else if(i==j)
A[i][j]=0;
else
A[i][j]=p->mat.m[i][j];
}
}
cout<<"请输入您开始要建造的景点编号";
cin>>a;
cout<<"请输入您要完成到的达景点编号";
cin>>b;
cout<<"\n*道路修建规划图(prime算法)规划如下:\n";
int lowcost[M],closest[M],k=0,sum=0,num=0;
for(int i=1;i<=p->mat.count;++i)
{
lowcost[i]=A[a][i];
closest[i]=a;
}
for(int i=1;imat.count;++i)
{
int min=INF;
for(int j=1;j<=p->mat.count;++j)
{
if(lowcost[j]&&(lowcost[j]mat.Pname[closest[k]]<<" 到景点 "<mat.Pname[k]<<" ,该条道路长度为:"<mat.count;++j)
{
if(A[k][j]&&A[k][j]next;
}
if(tag)
cout<<"\n*景区景点分布图查询不成功!\n";
}
void build_road()//道路修建规划图、最小生成树(prime算法)
{
Scenic *p;
int key;
cout<<"\n*请输入对应景区的名称:";
string name;
cin>>name;
getchar();
key=hash(name);
p=S[key].next;
if(p==NULL)
cout<<"\n*景区景点分布图(邻接矩阵表示)查询不存在!\n";
else
{
prime(p,name);
returnMainFace();
}
}
void scenic_message()//文件输出所有信息
{
system("cls");
char ch[200];
ifstream inFile; //输入流对象
inFile.open("景区景点信息表.txt",ios::in);
while(!inFile.eof())
{
inFile.getline(ch,sizeof(ch),'\n');
cout< v;
cout<<"请输入原先的景点名称: ";
cin>>name;
cout<<"请输入要修改后的名称: ";
cin>>rname;
for(i=1;i<=p->mat.count;++i)
{
if(p->mat.Pname[i]==name)
{
p->mat.Pname[i]=rname;
break;
}
}
while(inFile)
{
getline(inFile, str);
v.push_back(str);
}
stringstream stream;
string result,s,a,r;// std::string result;
stream << i; //将int输入流
stream >> r; //从stream中抽取前面插入的int值
s="景点编号为"+r;
s+="名称为";
a=s;
s+=name;
a+=rname;
ofstream outFile("景区景点信息表.txt",ios::out);
vector::const_iterator it=v.begin();
for(;v.end()!=it;++it)
{
if(*it==s)
{
//v.erase(v.begin()+j);
outFile< v;
cout<<"请输入的该道路上景点1的名称: ";
cin>>name1;
cout<<"请输入的该道路上景点2的名称: ";
cin>>name2;
cout<<"请输入的该道路上原先的权值: ";
cin>>weight;
cout<<"请输入该道路上要修改后的的权值: ";
cin>>weight1;
for( i=1;i<=p->mat.count;++i)//修改到程序里面
{
if(p->mat.Pname[i]==name1)
x=i;
if(p->mat.Pname[i]==name2)
y=i;
}
p->mat.m[x][y]=p->mat.m[y][x]=weight1;
while(inFile)//下面修改到文件里面
{
getline(inFile, str);
v.push_back(str);
}
//outFile<mat.Pname[n1]<<"和"<mat.Pname[n2]<<"之间的直接道路长度是"<mat.m[n1][n2]<> w; //从stream中抽取前面插入的int值
stream1 << weight1; //将int输入流
stream1 >> w1; //从stream中抽取前面插入的int值
s=name1;ss=name2;
s+="和";ss+="和";
s+=name2;ss+=name1;
s+="之间的直接道路长度是";ss+="之间的直接道路长度是";
a=s;b=ss;
s+=w;ss+=w;
a+=w1;b+=w1;
ofstream outFile("景区景点信息表.txt",ios::out);
vector::const_iterator it=v.begin();
for(;v.end()!=it;++it)
{
if(*it==s)
outFile< v;
cout<<"请输入小路两旁的1景区";
cin>>name1;
cout<<"请输入小路两旁的2景区";
cin>>name2;
cout<<"请输入该小路的权值";
cin>>weight;
for(i=1;i<=p->mat.count;++i)
{
if(p->mat.Pname[i]==name1)
x=i;
if(p->mat.Pname[i]==name2)
y=i;
}
p->mat.m[x][y]=p->mat.m[y][x]=weight;
while(inFile)//下面修改到文件里面
{
getline(inFile, str);
v.push_back(str);
}
ofstream outFile("景区景点信息表.txt",ios::out);
stringstream stream,stream1,stream2;
string s,s1,ss,num,num1,w,m;
vector::const_iterator it=v.begin();
stream<mat.edge;
stream>>num;
p->mat.edge+=1;
stream1<mat.edge;
stream1>>num1;
s="该景区的道路数目为:";s1="该景区的道路数目为:";
s+=num;s1+=num1;
for(;v.end()!=it;++it)
{
if(*it==s)
outFile<>num;
stream1<>num1;
s="景点编号为"+num+"名称为"+name1;
outFile<>w;
s=name1+"和"+name2+"之间的直接道路长度是"+w;
outFile<>name;
getchar();
key=hash(name);
p=S[key].next;
if(p==NULL)
cout<<"\n*您要修改的"<mat.Sname==name)
{
cout<<"*******下面为该景区的一些信息:"<mat.Sname<mat.count;++i)
{
cout<<"编号为 "<mat.Pname[i];
for(int j=1;j<=p->mat.count;++j)
cout<<' '<mat.m[i][j];
cout<>n;
switch(n)
{
case 1:
change_sceic_name(p);
break;
case 2:
change_weight(p);
break;
case 3:
increase_number(p);
break;
case 0:
returnMainFace();
break;
}
tag=0;
break;
}
else
p=p->next;
}
if(tag)
cout<<"*您要修改的"<='0'&&c<='8'))
{
cout<<"*输入有误,请重新输入:";
c=getch();
cout<
main.cpp
#include
#include"sxy.h"
using namespace std;
int main()
{
Welcome();
return 0;
}