都說現(xiàn)今內(nèi)存不值錢了,哈,也就不考慮空間復(fù)雜度的問題了,弄了倆輔助數(shù)組,覺得解這題還是挺容易的,就是不知道有沒有BUG。
問題描述:
假設(shè)圖G采用鄰接表存儲,中國自學(xué)編程網(wǎng),www.zxbc.cn ,編寫一個實現(xiàn)連通圖G的深度優(yōu)先遍歷(從頂點v出發(fā))的非遞歸算法。
算法思路:
就是深度優(yōu)先的思路。同樣是一個visited[]數(shù)組,標記已訪問過的頂點。又用了一個_vertex[]數(shù)組,用于存放頂點。
算法實現(xiàn):
#include
#include
#include
#define MAXSIZE 100
typedef char InfoType;
typedef char vertex;
typedef struct ANode //定義弧類型
{
int adjvex;
struct ANode *nextarc;
InfoType Info;
}ArcNode;
typedef struct //定義頂點類型
{
vertex data;
ArcNode *fistarc;
}VertexNode;
typedef struct //定義圖類型
{
VertexNode adjlist[MAXSIZE]; //鄰接表
int n,e;
}ALGraph;
void CreateALGraph(ALGraph *&g,int array[][MAXSIZE],int k) //傳遞一個鄰接矩陣創(chuàng)建圖
{
g=(ALGraph *)malloc(sizeof(ALGraph));
for(int i=0;i g->adjlist[i].fistarc=NULL;
int cnt=0;
ArcNode *p;
for(i=0;i for(int j=0;j if(array[i][j]!=0)
{
cnt++;
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=g->adjlist[i].fistarc;
g->adjlist[i].fistarc=p;
}
g->n=k;g->e=cnt;
}
void dfs(ALGraph *g,int v,int visited[],int _vertex[]) //dfs()
{
int _v,i=0; //_v為初始頂點v的鄰接點
ArcNode *p;
_vertex[0]=v; //保存頂點的數(shù)組
visited[v]=1; //標記頂點是否已訪問的數(shù)組
p=g->adjlist[v].fistarc; //p為頂點v的第一條邊
while(p!=NULL)
{
_v=p->adjvex;
if(visited[_v]==0) //如果該頂點未訪問過
{
i++;
_vertex[i]=_v;
visited[_v]=1;
p=g->adjlist[_v].fistarc; //從下一個未訪問過的頂點開始深度優(yōu)先遍歷
}
else //否則找下一個相領(lǐng)頂點
p=p->nextarc;
}
for(int j=0;j<=i;j++) //打印出_vertex數(shù)組中的內(nèi)容,即連通圖的所有頂點
printf(\"%d \",_vertex[j]);
printf(\"\\n\");
}
int main() //主函數(shù)調(diào)用
{
int graph_array[ ][MAXSIZE]={
{0,1,0,1,1},
{1,0,1,1,0},
{0,1,0,1,1},
{1,1,1,0,1},
{1,0,1,1,0}
};
ALGraph *g;
CreateALGraph(g,graph_array,5);
int visited[MAXSIZE]={0};
int _vertex[MAXSIZE]={0};
dfs(g,2,visited,_vertex);
return 0;
}
輸出:
2 4 3 1 0
問題描述:
假設(shè)圖G采用鄰接表存儲,中國自學(xué)編程網(wǎng),www.zxbc.cn ,編寫一個實現(xiàn)連通圖G的深度優(yōu)先遍歷(從頂點v出發(fā))的非遞歸算法。
算法思路:
就是深度優(yōu)先的思路。同樣是一個visited[]數(shù)組,標記已訪問過的頂點。又用了一個_vertex[]數(shù)組,用于存放頂點。
算法實現(xiàn):
#include
#include
#include
#define MAXSIZE 100
typedef char InfoType;
typedef char vertex;
typedef struct ANode //定義弧類型
{
int adjvex;
struct ANode *nextarc;
InfoType Info;
}ArcNode;
typedef struct //定義頂點類型
{
vertex data;
ArcNode *fistarc;
}VertexNode;
typedef struct //定義圖類型
{
VertexNode adjlist[MAXSIZE]; //鄰接表
int n,e;
}ALGraph;
void CreateALGraph(ALGraph *&g,int array[][MAXSIZE],int k) //傳遞一個鄰接矩陣創(chuàng)建圖
{
g=(ALGraph *)malloc(sizeof(ALGraph));
for(int i=0;i
int cnt=0;
ArcNode *p;
for(i=0;i
{
cnt++;
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=g->adjlist[i].fistarc;
g->adjlist[i].fistarc=p;
}
g->n=k;g->e=cnt;
}
void dfs(ALGraph *g,int v,int visited[],int _vertex[]) //dfs()
{
int _v,i=0; //_v為初始頂點v的鄰接點
ArcNode *p;
_vertex[0]=v; //保存頂點的數(shù)組
visited[v]=1; //標記頂點是否已訪問的數(shù)組
p=g->adjlist[v].fistarc; //p為頂點v的第一條邊
while(p!=NULL)
{
_v=p->adjvex;
if(visited[_v]==0) //如果該頂點未訪問過
{
i++;
_vertex[i]=_v;
visited[_v]=1;
p=g->adjlist[_v].fistarc; //從下一個未訪問過的頂點開始深度優(yōu)先遍歷
}
else //否則找下一個相領(lǐng)頂點
p=p->nextarc;
}
for(int j=0;j<=i;j++) //打印出_vertex數(shù)組中的內(nèi)容,即連通圖的所有頂點
printf(\"%d \",_vertex[j]);
printf(\"\\n\");
}
int main() //主函數(shù)調(diào)用
{
int graph_array[ ][MAXSIZE]={
{0,1,0,1,1},
{1,0,1,1,0},
{0,1,0,1,1},
{1,1,1,0,1},
{1,0,1,1,0}
};
ALGraph *g;
CreateALGraph(g,graph_array,5);
int visited[MAXSIZE]={0};
int _vertex[MAXSIZE]={0};
dfs(g,2,visited,_vertex);
return 0;
}
輸出:
2 4 3 1 0