#include <iostream>
using namespace std;
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20//最大顶点个数
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct{
string vexs[MAX_VERTEX_NUM];//顶点向量
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵.对无权图,用1或0表示相邻否;对带权图,则为权值类型
int vexnum,arcnum;//图的当前顶点数和弧数
GraphKind kind;//图的种类标志
}MGraph;
int LocateVex(MGraph G,string v)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(G.vexs[i]==v)break;
}
return i;
}
void Create(MGraph &G)
{
int i;
cout<<"图的顶点数:";
cin>>G.vexnum;
cout<<"图的弧数:";
cin>>G.arcnum;
cout<<"图的当前顶点名:";
for(i=0;i<G.vexnum;i++)cin>>G.vexs[i];//构造顶点向量
}
void CreateDG(MGraph &G)
{
int i,j,k;
string v1,v2;
Create(G);
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=0;//初始化邻接矩阵
cout<<"依次输入图的弧头顶点和弧尾顶点:"<<endl;
for(k=0;k<G.arcnum;k++)
{
cin>>v1>>v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G.arcs[i][j]=1;
}
}
void CreateUDG(MGraph &G)
{
int i,j,k;
string v1,v2;
Create(G);
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=0;//初始化邻接矩阵
cout<<"依次输入图的弧连接的两顶点:"<<endl;
for(k=0;k<G.arcnum;k++)
{
cin>>v1>>v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G.arcs[i][j]=1;
G.arcs[j][i]=1;
}
}
void CreateDN(MGraph &G)
{
int i,j,k;
string v1,v2;
Create(G);
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=INFINITY;//初始化邻接矩阵
cout<<"依次输入图的弧头顶点和弧尾顶点及弧的权值:"<<endl;
for(k=0;k<G.arcnum;k++)
{
cin>>v1>>v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
cin>>G.arcs[i][j];
}
}
void CreateUDN(MGraph &G)
{
int i,j,k;
string v1,v2;
Create(G);
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=INFINITY;//初始化邻接矩阵
cout<<"依次输入图的弧连接的两顶点及弧的权值:"<<endl;
for(k=0;k<G.arcnum;k++)
{
cin>>v1>>v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
cin>>G.arcs[i][j];
G.arcs[j][i]=G.arcs[i][j];
}
}
void PrintAdjMatrix(MGraph G)
{
int i,j;
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
{
if(G.arcs[i][j]==INFINITY)cout<<"∞"<<'\t';
else cout<<G.arcs[i][j]<<'\t';
}
cout<<endl;
}
}
int visit1[MAX_VERTEX_NUM];
void DFS(MGraph G,int v)
{
int w;
cout<<G.vexs[v]<<'\t';visit1[v]=1;//访问第v个顶点
for(w=1;w<G.vexnum;w++)//依次检查邻接矩阵v所在行
{
if(visit1[w]!=1&&G.arcs[v][w]!=INFINITY&&G.arcs[v][w]!=0)
DFS(G,w);
}
}
void BFS(MGraph G,int v)
{
int i(0),j(1),w,visit2[G.vexnum];
string a[G.vexnum];
cout<<G.vexs[v]<<'\t';visit2[v]=1;//访问第v个顶点
a[i]=G.vexs[v];//深度优先数组
while(i<G.vexnum)
{
for(w=1;w<G.vexnum;w++)//依次检查邻接矩阵v所在行
{
if(visit2[w]!=1&&G.arcs[v][w]!=INFINITY&&G.arcs[v][w]!=0)
{
cout<<G.vexs[w]<<'\t';visit2[w]=1;
i++;a[i]=G.vexs[w];
}
}
v=LocateVex(G,a[j]);j++;//依次访问深度优先数组
}
}
int main()
{
int v,choice;
string vv;
MGraph G;
system("cls");
cout<<"图的种类:1有向图 2无向图 3有向网 4无向网"<<endl<<"你的选择:";
cin>>choice;
switch(choice)
{
case 1:
{
G.kind=DG;CreateDG(G);break;
}
case 2:
{
G.kind=UDG;CreateUDG(G);break;
}
case 3:
{
G.kind=DN;CreateDN(G);break;
}
case 4:
{
G.kind=UDN;CreateUDN(G);break;
}
}
PrintAdjMatrix(G);
cout<<"从哪个顶点开始遍历:";
cin>>vv;
v=LocateVex(G,vv);
cout<<"深度优先遍历:";
DFS(G,v);
cout<<endl<<"广度优先遍历:";
BFS(G,v);
return 0;
}/*
6 10
v1 v2 v3 v4 v5 v6
v1 v2 5
v2 v3 4
v3 v1 8
v1 v4 7
v3 v6 9
v6 v1 3
v4 v3 5
v4 v6 6
v6 v5 1
v5 v4 5*/
/*
7 8
A B C F L J M
A B
A C
A F
A L
B M
L J
L M
J M*/