您的位置:首页 > 其它

图的遍历 与创建 邻接表与临接矩阵

2012-11-19 21:02 232 查看
http://blog.csdn.net/hackerain/article/details/6039194

#pragma once
#include <iostream>
using namespace std;

//
#define MAX 1000000
#define MAX_VERTEX_NUM 20
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct
{
char vexs[MAX_VERTEX_NUM];//一维数组存储顶点信息
int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//二维数组存储顶点边的信息
int vertexnum,edgenum;//顶点数目和边
GraphKind kind;//图的种类
}MGraph;

//创建无向图的邻接矩阵
void CreateUDG_AM(MGraph &G,int n,int e)
{
G.vertexnum=n;
G.edgenum=e;
int i,j,k;
for(i=0;i<n;i++)
cin>>G.vexs[i];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
G.edges[i][j]=0;
for(k=0;k<e;k++)
{
cin>>i>>j;
//	G.edges[i][j]=G.edges[j][i]=1;//输入边的信息
G.edges[i][j]=1;
}
}
//无向图的深度优先遍历
int visited[MAX_VERTEX_NUM];
void DFS_AM(MGraph &G,int i)
{
int j;
cout<<G.vexs[i]<<" ";
visited[i]=1;
for(j=0;j<G.vertexnum;j++)
{
if((G.edges[i][j])==1&&(visited[j]==0))
DFS_AM(G,j);
}
}

void DFS_Traverse_AM(MGraph& G)
{
int i;
for(i=0;i<G.vertexnum;i++)
visited[i]=0;
for(i=0;i<G.vertexnum;i++)
if(!visited[i])
DFS_AM(G,i);
}
////无向图的广度优先遍历
void BFS_Traverse_AM(MGraph& G)
{
int i,j,v;
for(i=0;i<G.vertexnum;i++)
visited[i]=0;
std::queue<int> Q;
for(i=0;i<G.vertexnum;i++)
{
if(!visited[i])
{
cout<<G.vexs[i]<<" ";
visited[i]=1;
Q.push(i);
while(!Q.empty())
{
int v=Q.front();
Q.pop();
for(j=0;j<G.vertexnum;j++)
{
if(G.edges[v][j]&&!visited[j])
{
cout<<G.vexs[j]<<" ";
visited[j]=1;
Q.push(j);
}
}
}
}
}
}

///////////////////////////////////////////
////邻接表////////////////////////
typedef struct EdgeNode
{
int adjvex;//
struct EdgeNode* nextedge;
int weight;
}EdgeNode;
typedef struct VexNode
{
char vex;//存放顶点的信息
EdgeNode *firstedge;//指向第一个编表节点
}VexNode;
typedef struct
{
VexNode vexs[MAX_VERTEX_NUM];
int vexnum,edgenum;
GraphKind kind;
}LGraph;
void CreateDG_AL(LGraph &G,int n,int e)
{
int i,j,k;
G.vexnum=n;
G.edgenum=e;
G.kind=DG;
for(i=0;i<n;i++)
{
cin>>G.vexs[i].vex;
G.vexs[i].firstedge=NULL;
}
for(k=0;k<e;k++)
{
EdgeNode* p;
cin>>i>>j;
p=new EdgeNode;
p->adjvex=j;
p->nextedge=G.vexs[i].firstedge;
G.vexs[i].firstedge=p;//头插法
}
}

//有向图的深度优先遍历
void DFS_AL(LGraph &G,int v)
{
int j;
EdgeNode* p;
cout<<G.vexs[v].vex<<" ";
visited[v]=1;
for(p=G.vexs[v].firstedge;p;p=p->nextedge)
{
j=p->adjvex;
if(!visited[j])
DFS_AL(G,j);
}
}
void DFS_Traverse_AL(LGraph &G)
{
int i;
for(i=0;i<G.vexnum;i++)
{
visited[i]=0;
}
for(i=0;i<G.vexnum;i++)
if(!visited[i])
DFS_AL(G,i);
}
///有向图的广度
void BSF_Traverse_AL(LGraph &G)
{
int i,j,v;
EdgeNode* p;
for(i=0;i<G.vexnum;i++)
visited[i]=0;
std::queue<int> Q;
for(i=0;i<G.vexnum;i++)
{
if(!visited[i])
{
cout<<G.vexs[i].vex<<" ";
visited[i]=1;
Q.push(i);
while(!Q.empty())
{
v=Q.front();
Q.pop();
for(p=G.vexs[i].firstedge;p;p=p->nextedge)
{
j=p->adjvex;
if(!visited[j])
{
cout<<G.vexs[j].vex<<" ";
visited[j]=1;
Q.push(j);
}
}
}
}
}
}


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