//邻接矩阵表示图广度优先,深度优先
#include <iostream>
#include <queue>
/*gragh.txt
8 9ABCDEFGH
0 1 1
0 2 1
1 3 1
1 4 1
3 7 1
4 7 1
2 5 1
2 6 1
5 6 1
*/
#include <fstream>
#define MaxVertex 100//最大顶点数
using namespace std;
int visited[MaxVertex]; //不用在初始化,因为写在main外默认为0、
int visited1[MaxVertex];
struct MGraph
{
char vexs[MaxVertex];
int edges[MaxVertex][MaxVertex];
int vexnum,edgnum;
};
//无向图邻接矩阵建立算法
void CreatMGraph(MGraph *G)
{
int i,j,k,w;
cin>>G->vexnum>>G->edgnum;//读入顶点数和边数
for(i=0;i<G->vexnum;i++)//读入顶点信息
cin>>G->vexs[i];
for(i=0;i<G->vexnum;i++)//邻接矩阵初始化
for(j=0;j<G->vexnum;j++)
G->edges[i][j]=0;
for(k=0;k<G->edgnum;k++)//输入边(i,j)上的权值w
{
cin>>i>>j>>w;
G->edges[i][j]=w;
}
}
//广度优先遍历。
void MGraphBFS(MGraph *G,int i)
{
queue<int> q; //用到队列
int x,j;
if(!visited[i])
{
cout<<G->vexs[i];
visited[i]=1;
q.push(i);
}
while(!q.empty())
{
x=q.front();//取队头
q.pop();//出队
for(j=0;j<G->vexnum;j++)
if (G->edges[x][j]&&!visited[j])
{
cout<<G->vexs[j];
visited[j]=1;
q.push(j);
}
}
}
void MGraphDFS(MGraph *G,int i)
{
int j;
if(!visited1[i])
{
cout<<G->vexs[i];
visited1[i]=1;
}
for(j=0;j<G->vexnum;j++)//递归
if(G->edges[i][j]&&!visited1[j])
{
MGraphDFS(G,j);
}
}
void PrintMGraph(MGraph *G)
{
int j,i;
for(i=0;i<G->vexnum;i++)//邻接矩阵
{
for(j=0;j<G->vexnum;j++)
cout<<G->edges[i][j]<<" ";
cout<<endl;
}
}
int main()
{
MGraph *G=new MGraph;
CreatMGraph(G);
cout<<"输出邻接矩阵/n";
PrintMGraph(G);
cout<<"广度优先遍历/n";
MGraphBFS(G,0);
cout<<endl;
cout<<"深度优先遍历/n";
MGraphDFS(G,0);
cout<<endl;
return 0;
}