#include<stdio.h>
#include<iostream.h>
#define MAX 100
#define N 100
/**************************************************************************/
typedef struct
{
char v[N];
}V;
typedef struct //邻接矩阵
{
V v[MAX];//存结点信息
V e[MAX];//存边信息
int ed[MAX][MAX];//边的权信息的数组
int ves;//结点数
int edge;//边数
int invited[MAX];//标志判断是否有被访问过
}MGraph;
void createMGraph(MGraph *G) //创建邻接矩阵
{
printf("请分别输入要访问的城市个数和总共的道路数:\n");
cin>>G->ves>>G->edge;
printf("定义一个起始城市,输入它,从它开始,按自己规定的顺序依次输入其余城市名称:\n");
for(int k = 0; k < G->ves; k++)
scanf("%s",G->v[k].v);
printf("请从你定义的起始城开始,输入它以及它所连接的城市以及他们之间的距离:\n");
for(int l = 0; l < G->edge; l++ )
scanf("%s",G->e[l].v);
for(int i=0 ; i<G->ves ; i++) //图的初始化
for(int j=0; j<G->ves ; j++)
{
if(i==j)
G->ed[i][j]=0;
else
G->ed[i][j]=32767;
}
int vi,vj,w;
for(int z=0; z<G->edge ; z++)
{
printf("请输入边的信息i,j,w(以空格分隔):");
scanf("%d%d%d",&vi,&vj,&w);
//若为不带权值的图,则w输入1
//若为带权值的图,则w输入对应权值
G->ed[vi-1][vj-1]=w;//①
G->ed[vj-1][vi-1]=w;//②
//无向图具有对称性的规律,通过①②实现
//有向图不具备此性质,所以只需要①
}
}
void DispGraph(MGraph G) //输出邻接矩阵的信息
{
int i,j;
printf("\n输出邻接矩阵:\n");
printf("\t");
for(i=0;i<G.ves;i++)
{
printf("\n%8d",i+1);
for(j=0;j<G.ves;j++)
{
if(G.ed[i][j]==32767)
//两点之间无连接时权值为默认的32767,在无向图中一般用"0"表示,在有向图中一般用"∞",这里为了方便统一输出 "∞"
printf("%8s", "∞");
else
printf("%8d",G.ed[i][j]);
}
printf("\n");
}
}
void visit(MGraph *G,int i)
{
cout<<"第"<<i+1<<"个城市:"<<G->v[i].v<<endl;
if(++i==G->ves)
{
cout<<"存在道路"<<G->edge<<"条,如下所示:\n";
for(int z = 0; z < G->edge ; z++)
cout<<"第"<<z+1<<"条道路为:"<<G->e[z].v<<endl;
if(G->e[z].v=='\0')
cout<<"\n";
}
}
void dfs(MGraph *G)//深度优先遍历
{
for(int i = 0; i < G->ves; i++)
{
if(G->invited[i] == 0)//如果该结点没有访问过
{
G->invited[i] = 1;//被访问过的结点置为1
visit(G,i);
dfs(G);
}
}
}
/*void visit()
{
cout<<"这里是**城市";
cout<<"这里的著名景点有**"<<"这里有什么一定要吃的美食"<<"...";
cout<<"在本人的旅行计划里:"<<"要到达该城市共有*条路径,包括:\n"<<"xxx...";
cout<<"其中,路径最短的是:**\n"<<"沿途风景最美的是:**\n";
}*/
void main()
{ printf("1:以邻接矩阵为储存方式的深度优先搜索\n");
MGraph L={"0","0",0,0,0,0};
printf("现在开始构建邻接矩阵!\n");
createMGraph(&L);
DispGraph(L);
printf("现在开始Depth-First-Search!\n");
dfs(&L);
}
大同 北京 济南 郑州 西安 太原 石家庄
大同—北京,其间距离379 大同—太原,其间距离355 北京—济南,其间距离298 北京—石家庄,其间距离283 济南—郑州,其间距离615 济南—石家庄,其间距离298 郑州—西安,其间距离620 郑州—石家庄,其间距离412 西安—太原,其间距离1554 西安—石家庄,其间距离1552 太原—石家庄,其间距离340
1 2 379 1 6 355 2 3 298 2 7 283 3 4 615 3 6 298 4 5 620 4 7 412 5 6 1554 5 7 1552 6 7 340
//队列
2 379 0
6 355 1
3 298 0
7 283 1
4 615 0
6 298 1
5 620 0
7 412 1
6 1554 0
7 1552 1
7 340 1