導航
1.無向圖的遍歷 深搜
2.無向圖遍歷 寬搜
————————————————————————————————————————
1.無向圖的遍歷
按照深搜遍歷順序是:1 2 4 3 5
首先要建立圖表:n*n的表格
其中1爲兩個點連接,無窮是沒有關係,0是自身不會有連接
設計這麼一張表就是爲了能夠進行深搜,我們一步步來看
從第一行開始,找到第一個爲1的點是2
進入第二行,其中第二行第一個已經訪問過了,接着找到第二行第四個位置沒有訪問過
進入到第四行,2訪問過了,接着重新回到第一行中,此時訪問3
進入第三行,其中1訪問過了,5沒有訪問過
進入第五行,其中的1和3都訪問過了,此時再回到第一行,第一行的第5頁訪問過了,此時就結束了。
那麼順序依次就是1 2 4 3 5
代碼
//圖的遍歷
#include <stdio.h>
int e[101][101],sum,book[101],n;
void dfs(int cur)
{
int i;
printf("%d ",cur);
sum++; //每訪問一個點加1
if(sum==n) return ;
//開始從1號開始嘗試
for(i=1;i<=n;i++){
if(e[cur][i]==1&&book[i]==0)
{
book[i]=1;
dfs(i);
}
}
}
int main()
{
int m,a,b,i,j;
//輸入矩陣的高寬
scanf("%d%d",&n,&m);
//初始化矩陣
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
e[i][j]=0;
else
e[i][j] = 9999999; //假設這裏爲無窮
//開始讀入頂點之間的邊
for(i=1;i<=m;i++){
scanf("%d%d",&a,&b);
e[a][b]=1;
e[b][a]=1; //這裏是無向圖,就用1來賦值
}
//首先從1號開始出發
book[1]=1;
dfs(1);
return 0;
}
運行結果:
解析代碼:
1.首先輸入的n是頂點數,m是邊數,對錶格進行賦值,輸入每對邊的兩個頂點,再對錶格進行二次賦值
2.開始進行dfs深搜,訪問表格第一行開始,首先便輸出1,然後繼續找到爲1的位置,並且對已經訪問過的進行標記,然後進入對應行,在進行整行遍歷
3.接着就跟上述一樣知道第一行所有都訪問過去了,才結束,此時就已經得到了深搜的順序
————————————————————————————————————————
2.無向圖遍歷 寬搜
建立表格:
輸入條件:
5 5
1 2
1 3
1 5
2 4
3 5
代碼:
#include <stdio.h>
int main()
{
int que[10001],head,tail,n,m,a,b,cur;
int book[101]={0},e[101][101];
int i,j;
//輸入頂點數和邊數
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=999999;
for(i=1;i<=m;i++){
scanf("%d%d",&a,&b);
e[a][b]=1;
e[b][a]=1;
}
//隊列初始化
head=1;
tail=1;
que[tail]=1;
tail++;
book[1]=1;
//當隊列不爲空的時候循環
while(head<tail)
{
cur = que[head]; //cur爲當前訪問的頂點編號
for(i=1;i<=n;i++){
//判斷是否有邊 並且沒有被訪問過
if(e[cur][i]==1&&book[i]==0)
{
que[tail]=i;
tail++;
book[i]=1;
}
//如果tail大於n了,就說明頂點都已經訪問過了
if(tail>n){
break;
}
}
head++;
}
//進行遍歷隊列了
for(i=1;i<tail;i++)
printf("%d ",que[i]);
return 0;
}
運行結果:
使用隊列來存儲依次訪問到的節點