日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

基于鄰結(jié)表的圖的DFS、BFS遍歷

 520jefferson 2015-08-21
#include "StdAfx.h"
#include "Graphlist.h"

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
//鄰結(jié)表的遍歷
using namespace std;
#define MAXNODE 1000 //圖中頂點的最大數(shù)
typedef int infotype;
typedef char vertype;
struct ArcNode  //邊界點類型
{
int adjvex; //該邊的終點編號
ArcNode *next; //指向下一條邊的指針
// infotype *info; //該邊的相關(guān)信息
};
struct VerNode//表頭節(jié)點
{
vertype vertex; //頂點信息
ArcNode *firstarc; //指向第一個鄰接點的指針
};

struct AlGraph//鄰接表
{
VerNode vertices[MAXNODE];//鄰接表
int vexnum,arcnum; //頂點和邊的數(shù)目
};

AlGraph CreateAdjList(AlGraph g)//建立有向圖的鄰接表存儲結(jié)構(gòu)
{
int n;
cin>>n;
for(int i = 1;i <= n; i++)
{
cin>>g.vertices[i].vertex;//輸入頂點信息
g.vertices[i].firstarc=NULL;//初始化每個鏈表為空
}
int v1, v2;
cin>>v1>>v2; //輸入一條邊依附的兩個頂點序號
int e = 0; //圖的邊數(shù)
while(v1 != 0&&v2!=0) //題目要求兩頂點之一為0結(jié)束
{
ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
//用頭插法插入節(jié)點以建立鏈表
p->adjvex = v2;
p->next = g.vertices[v1].firstarc;
g.vertices[v1].firstarc=p;
e++;
cin>>v1>>v2;
}
g.vexnum = n;
g.arcnum = e;
return g;
}

int visited[MAXNODE]; //訪問標志數(shù)組
void VisitFunc(AlGraph g, int v)//訪問v
{
cout<<g.vertices[v].vertex <<endl;
}
int GraphFirstAdj(AlGraph g , int v)//得到v的第一個鄰結(jié)點
{
if(g.vertices[v].firstarc!=NULL)
return g.vertices[v].firstarc->adjvex;
else return 0;
}

int GraphNextAdj(AlGraph g,int v, int w)//返回v的下一個鄰結(jié)點,若w是v的最后一個鄰結(jié)點則返回0
{
ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
p = g.vertices[v].firstarc;
while(p)
{
if(p->adjvex == w && p->next != NULL)
return p->next->adjvex;
p = p->next;
}
return 0;
}

void DFS(AlGraph g, int v)//dfs
{
visited[v] = 1; VisitFunc(g,v);//訪問v頂點(輸出v)
for(int w = GraphFirstAdj(g,v); w!= 0; w = GraphNextAdj(g,v,w))
{
if(!visited[w])DFS(g,w);//對v的尚未訪問的鄰接頂點w遞歸調(diào)用
}
}

void DFSTraverse(AlGraph g) //圖的dfs遍歷
{
for(int i = 1; i <= g.vexnum; i++) visited[i] = 0;//初始訪問數(shù)組置未訪問標志
for(int i = 1; i <= g.vexnum; i++)
{
if(!visited[i])DFS(g,i);//對未訪問的頂點調(diào)用DFS
}
}

void BFSTraverse(AlGraph g)// 圖的bfs遍歷
{
for(int i = 1; i <= g.vexnum;i++) visited[i] = 0;//初始訪問數(shù)組
queue<int> q;
for(int i = 1;i <= g.vexnum;i++)
{
if(!visited[i])
{
q.push(i);
visited[i] = 1;
VisitFunc(g,i);
while(!q.empty())
{
int v = q.front();//對頭元素出隊列并置為v
q.pop();
for(int w = GraphFirstAdj(g,v); w!=0; w = GraphNextAdj(g,v,w))//遍歷v的鄰結(jié)點
{
if(!visited[w])
{
q.push(w);//v的尚未訪問的鄰結(jié)頂點w入隊列Q
visited[w] = 1;
VisitFunc(g,w);
}
}
}
}
}

}

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多