无向图的邻接表算法
来源:互联网 发布:成都java培训 编辑:程序博客网 时间:2024/05/16 17:40
#include<iostream>
#define MAX_VEXS_NUM 20
using namespace std;
typedef struct Graph
{
int vexs[MAX_VEXS_NUM];
int edgs[MAX_VEXS_NUM][MAX_VEXS_NUM];
int n;
int e;
}MyGraphm,*MyGraph;
//用邻接表的形式来创建图
void createGraph(MyGraph &g)
{
int i=0,j=0,k=0,w=0,vexnum,arcnum;
g=new MyGraphm();
cout<<"请输入图的节点数和边数:/n";
cin>>g->n;
cin>>g->e;
vexnum=g->n;
arcnum=g->e;
cout<<"请输入各个节点:"<<endl;
for(i=0;i<vexnum;i++)
cin>>g->vexs[i];
for(i=0;i<vexnum;i++)
for(j=0;j<vexnum;j++)
{
g->edgs[i][j]=0;
}
cout<<"请输入无向图的各个边:"<<endl;
for(i=0;i<arcnum;i++)
{
scanf("%d",&j);
scanf("%d",&k);
scanf("%d",&w);
g->edgs[j][k]=w;
g->edgs[k][j]=w;
}
cout<<"无向图建立完毕"<<endl;
}
//标识节点是否被访问过的数组
bool visit[MAX_VEXS_NUM];
//定义了队列,方便广度优先遍历时使用
typedef struct Queue
{
int data[300];
int front;
int rear;
}MyQ,*MyQueue;
void initQueue(MyQueue &my)
{
MyQ *q=new MyQ();
my=q;
my->front=-1;
my->rear=-1;
cout<<"队列建立完毕/n";
}
void EnQueue(MyQueue &myQ,int i)
{
myQ->data[++(myQ->front)]=i;
}
bool IsEmpty(MyQueue &myQ)
{
if(myQ->front==myQ->rear)
{
return true;
}
else
return false;
}
int DeQueue(MyQueue &myQ)
{
int i=-1;
if(!IsEmpty(myQ))
{
i=myQ->data[++(myQ->rear)];
}
return i;
}
//返回某个节点的邻接节点
int nextVext(MyGraph &g,int k)
{
for(int i=0;i<g->n;i++)
{
if(g->edgs[k][i]!=0&&k!=i&&visit[i]==false)
{
return i;
}
}
return -1;
}
//深度遍历算法
void DFS(MyGraph &g,int i)
{
cout<<i<<" ";
visit[i]=true;
int w;
for(w=nextVext(g,i);w>0;w=nextVext(g,i))
{
//cout<<"w="<<w<<endl;
DFS(g,w);
}
}
void DFSTraverse(MyGraph &g)
{
for(int i=0;i<g->n;i++)
{
visit[i]=false;
}
for(int i2=0;i2<g->n;i2++)
{
if(visit[i2]==false)
DFS(g,i2);
}
}
//广度遍历算法
void BFSTraverse(MyGraph &g)
{
for(int i=0;i<MAX_VEXS_NUM;i++)
{
visit[i]=false;
}
MyQueue myQ;
initQueue(myQ);
for(int i=0;i<g->n;i++)
{
if(visit[i]==false)
{
cout<<i<<" ";
visit[i]=true;
EnQueue(myQ,i);
while(IsEmpty(myQ)==false)
{
int k=DeQueue(myQ);
for(int w=nextVext(g,k);w>0;w=nextVext(g,k))
{
cout<<w<<" ";
visit[w]=true;
EnQueue(myQ,w);
}
}
}
}
}
int main()
{
MyGraph my;
createGraph(my);
int i,j;
cout<<"此图的邻接矩阵表示法为:"<<endl;
for(i=0;i<my->n;i++)
{
for(j=0;j<my->n;j++)
{
cout<<my->edgs[i][j]<<" ";
}
cout<<endl;
}
cout<<"深度遍历的结果为:/n";
DFSTraverse(my);
cout<<endl;
cout<<"广度遍历的结果为:/n";
BFSTraverse(my);
system("pause");
return 1;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rongyongfeikai2/archive/2010/10/21/5957392.aspx
- 无向图的邻接表算法
- 无向图的邻接表算法
- 无向图的邻接表深度优先算法
- 无向图的邻接表广度优先算法
- 邻接表无向图的介绍
- 无向图的邻接表
- 无向图的邻接表储存
- 无向图的邻接表存储
- 邻接表无向图
- ACM 模板--邻接表 无向图 搜索算法
- 无向图的邻接多重链表存储算法(98)
- 无向图邻接表的存储结构
- 无向图邻接表的深度优先遍历(DFS)
- 无向图的邻接多重表存储结构
- 无向网图的邻接表存储结构
- 无向图的邻接表描述和遍历
- 无向图的表示:邻接矩阵和邻接表
- c语言实现无向图的邻接表储存
- C# 捕获USB插入,拔出事件
- 冒泡排序
- 好
- Android配置开发环境
- 快速排序详解
- 无向图的邻接表算法
- 堆排序
- 一直以来伴随我的一些学习习惯(一):学习与思考
- java中重写equals方法
- java Jmagick 图片缩略图处理
- 系统构架师学习 第一章
- 亿万用户网站MySpace的成功秘密
- 一直以来伴随我的一些学习习惯(二):时间管理
- C++中内存分配,堆(Heap)与栈(Stack)区别