#include
#include
using namespace std;
#define MVNum 100
#define MaxInt 32767
#define ok 1
bool visited[ MVNum ];
typedef char VexType;
typedef int Status;
typedef int ArcType;
typedef struct{
VexType vexs[ MVNum ]; //一维数组用字符型来表示顶点
ArcType arcs[ MVNum ][ MVNum ]; //二维数组用整数型来表示边的具体信息
int vexnum,arcnum; //定义总顶点数,总边数
}AMGraph; //函数名
//LacateVex函数:若G中存在顶点v,则返回该定点在图中的位置,否则返回其他信息
int LocateVex(AMGraph G,VexType v){
for( int i = 0;i < G.vexnum; i++ )
{if(v==G.vexs[i])
return i;
}
return -1;
}
//用邻接矩阵来创建无向网G
Status CreateUDN( AMGraph &G ){
int i,j,k;
ArcType w; //定义权值的数据类型
VexType v1,v2; //定义顶点的数据类型
cout<<"请输入顶点的个数n和边数m: " ;
cin>>G.vexnum>>G.arcnum;
cout<<“请输入顶点:”;
for(i=0;i<G.vexnum;i++)
{
cin>>G.vexs[i];
}
for(i = 0;i < G.vexnum;i++) //初始化邻接矩阵,边的权值均为最大值Maxint
for(j = 0;j < G.vexnum;j++)
G.arcs[i][j] == MaxInt;
cout<<“请输入各边和权值:”;
for(k=0;k<G.arcnum;k++){ //输入一条边的顶点和权值
cin>>v1>>v2>>w;
i=LocateVex(G,v1); //确定v1 v2在G中的位置,即顶点数组的下标
j=LocateVex(G,v2);
G.arcs[i][j]=w;
G.arcs[j][i]=G.arcs[i][j];
}
return ok;
}
//FirstAdjVex函数:返回v的第一个邻接顶点.若v在G种没有邻接顶点,则返回"空"
int FirstAdjVex(AMGraph G,int v){
for(int i=0;i<G.vexnum;i++)
{
if(G.arcs[v][i]==1)
return i;
}
return -1;
}
//NextAdjVex函数:返回v的下一个邻接顶点.若w是v的最后一个邻接点,则返回"空"
int NextAdjVex(AMGraph G,int v,int w){
for(int i=w+1;i<G.vexnum;i++)
{
if(G.arcs[v][i]==1)
return i;
}
return -1;
}
//深度遍历
void DFS(AMGraph G,int v){
visited[v]=true; //访问第v个顶点,并置访问标志数组相应分量值为true
cout<<G.vexs[v]<<" ";
for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)) //依次检查v的所有邻接点w
{
if(!visited[w]) //对v的尚未访问的邻接顶点,递归调用DFS
DFS(G,w);
}
}
void DFSTraverse(AMGraph G){
for(int i=0;i<G.vexnum;i++) //访问标志数组初始化
visited[i]=false;
for(int i=0;i<G.vexnum;i++)
{
if(!visited[i]) //对为访问的顶点调用DFS
DFS(G,i);
} }
//主函数,函数调用
int main(){
AMGraph G;
CreateUDN(G);
cout<<“输出的邻接矩阵为:”<<endl;
for(int i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
{
if(G.arcs[i][j]!=MaxInt)
cout<<G.arcs[i][j]<<" “;
else
cout<<‘0’<<” ";
}
cout<<endl;
}
cout<<“深度优先的遍历顺序是:”;
DFSTraverse(G);
return ok;