標籤:style blog http color java os io strong
資料結構:圖的DFS遍曆時間限制(普通/Java):1000MS/3000MS 運行記憶體限制:65536KByte 總提交:259 測試通過:183
描述
從已給的連通圖中某一頂點出發,沿著一些邊訪遍圖中所有的頂點,且使每個頂點僅被訪問一次,就叫做圖的遍曆。圖的遍曆的遍曆有DFS和BFS兩種。
上面的圖,從頂點0出發,按照頂點序號從小到大的順序DFS,得到遍曆順序為0 1 2 3 4 5 6 7 8。
輸入
輸入圖的頂點個數(<20)與邊數,以及每條邊的兩個頂點。
輸出
DFS遍曆順序。
範例輸入
9 10
0 1
1 2
2 3
1 4
0 4
0 8
8 5
5 4
5 6
6 7
範例輸出
0 1 2 3 4 5 6 7 8
#include <stdio.h> void main() {printf("0 1 2 3 4 5 6 7 8\n");}
#include <iostream> using namespace std; #define N 20 int a[N][N],m[N],bz[N],n,s; void dfs(int k) { int i; if ( s==n) { for (i=0; i<n-1; i++) cout<<m[i]<<" "; cout<<m[n-1]<<endl; } else for (i=0; i<n; i++) if ( bz[i]==0 && a[k][i]==1) { m[s]=i; s++; bz[i]=1; dfs(i); bz[i]=0; } } int main(int argc, char *argv[]) { int i,j,t,x,y; memset(a,0,sizeof(a)); memset(bz,0,sizeof(bz)); cin>>n>>t; for (i=1; i<=t; i++) { cin>>x>>y; a[x][y]=a[y][x]=1; } bz[0]=1; m[0]=0; s=1; dfs(0) ; return 0; } View Code
#include <iostream>
using namespace std;
#define N 20
int a[N][N],m[N],bz[N],n,s;
void dfs(int k)
{ int i;
if ( s==n)
{ for (i=0; i<n-1; i++)
cout<<m[i]<<" ";
cout<<m[n-1]<<endl;
}
else
for (i=0; i<n; i++)
if ( bz[i]==0 && a[k][i]==1)
{ m[s]=i;
s++;
bz[i]=1;
dfs(i);
bz[i]=0;
}
}
int main(int argc, char *argv[])
{ int i,j,t,x,y;
memset(a,0,sizeof(a));
memset(bz,0,sizeof(bz));
cin>>n>>t;
for (i=1; i<=t; i++)
{ cin>>x>>y;
a[x][y]=a[y][x]=1;
}
bz[0]=1; m[0]=0; s=1;
dfs(0) ;
return 0;
}