小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

基于鄰結表的圖的DFS、BFS遍歷

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

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

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

AlGraph CreateAdjList(AlGraph g)//建立有向圖的鄰接表存儲結構
{
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; //圖的邊數
while(v1 != 0&&v2!=0) //題目要求兩頂點之一為0結束
{
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]; //訪問標志數組
void VisitFunc(AlGraph g, int v)//訪問v
{
cout<<g.vertices[v].vertex <<endl;
}
int GraphFirstAdj(AlGraph g , int v)//得到v的第一個鄰結點
{
if(g.vertices[v].firstarc!=NULL)
return g.vertices[v].firstarc->adjvex;
else return 0;
}

int GraphNextAdj(AlGraph g,int v, int w)//返回v的下一個鄰結點,若w是v的最后一個鄰結點則返回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遞歸調用
}
}

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

void BFSTraverse(AlGraph g)// 圖的bfs遍歷
{
for(int i = 1; i <= g.vexnum;i++) visited[i] = 0;//初始訪問數組
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的鄰結點
{
if(!visited[w])
{
q.push(w);//v的尚未訪問的鄰結頂點w入隊列Q
visited[w] = 1;
VisitFunc(g,w);
}
}
}
}
}

}

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多