您的位置:首页 > 其它

图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)

2012-05-25 14:14 375 查看
#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
using namespace std;

typedef struct MGraph{
string vexs[10];//顶点向量
int arcs[10][10];//邻接矩阵
int vexnum, arcnum;//图的顶点数和边数
}MGraph;

int LocateVex(MGraph G, string u)//返回顶点u在图中位置
{
for(int i=0; i<G.vexnum; i++)
if(u==G.vexs[i])
return i;
return -1;
}

void CreateUDG(MGraph &G)//构造无向图
{
string v1,v2;
int i, j, k;
cout<<"请输入顶点数和边数:";
cin>>G.vexnum>>G.arcnum;

cout<<"请输入顶点:";
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.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]=G.arcs[j][i]=1;
}
}

void CreateUDN(MGraph &G)//构造无向网
{
string v1, v2;
int i, j, k;
int w;
cout<<"请输入顶点数和边数:";
cin>>G.vexnum>>G.arcnum;

cout<<"请输入顶点:";
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.arcs[i][j]=-1000;

cout<<"请输入边:"<<endl;
for(k=0; k<G.arcnum; k++)
{
cin>>v1>>v2>>w;
i=LocateVex(G, v1);
j=LocateVex(G, v2);
G.arcs[i][j]=G.arcs[j][i]=w;
}
}

void CreateDG(MGraph &G)//构造有向图
{
string v1, v2;
int i, j, k;
cout<<"请输入顶点数和边数:";
cin>>G.vexnum>>G.arcnum;

cout<<"请输入顶点:";
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.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 CreateDN(MGraph &G)//构造有向网
{
string v1, v2;
int i, j, k;
int w;
cout<<"请输入顶点数和边数:";
cin>>G.vexnum>>G.arcnum;

cout<<"请输入顶点:";
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.arcs[i][j]=-1000;

cout<<"请输入边:"<<endl;
for(k=0; k<G.arcnum; k++)
{
cin>>v1>>v2>>w;
i=LocateVex(G, v1);
j=LocateVex(G, v2);
G.arcs[i][j]=w;
}
}

int FirstAdjVex(MGraph G, int v)//返回顶点v的第一个邻接顶点序号
{
for(int i=0; i<G.vexnum; i++)
if(G.arcs[v][i]==1)
return i;
return -1;
}

int NextAdjVex(MGraph G, int v, int w)//返回顶点v的相对于w的下一个邻接顶点序号
{
for(int i=w+1; i<G.vexnum; i++)
if(G.arcs[v][i]==1)
return i;
return -1;
}

bool visited[100];

void DFS(MGraph G, int v)
{
visited[v]=true;
cout<<G.vexs[v]<<" ";
for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w))
if(!visited[w])
DFS(G, w);
}

void DFSTraverse(MGraph G)//深搜
{
for(int i=0; i<G.vexnum; i++)
visited[i]=false;

for(i=0; i<G.vexnum; i++)
if(!visited[i])
DFS(G, i);
}

void BFSTraverse(MGraph G)//广搜,类似于树的层次遍历
{
for(int i=0; i<G.vexnum; i++)
visited[i]=false;

queue<int> q;

for(i=0; i<G.vexnum; i++)
{
if(!visited[i])
{
visited[i]=true;
q.push(i);
while(!q.empty())
{
int v=q.front();
q.pop();
cout<<G.vexs[v]<<" ";
for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w))
{
if(!visited[w])
{
visited[w]=true;
q.push(w);
}
}
}
}
}
}

void main()
{
MGraph g;
CreateUDG(g);

cout<<"深搜:";
DFSTraverse(g);
cout<<endl;

cout<<"广搜:";
BFSTraverse(g);
cout<<endl;

}




图的结构如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐