图的深度遍历
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss
Problem Description
请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出。遍历时,先遍历节点编号小的。
Input
输入第一行为整数n(0 < n < 100),表示数据的组数。 对于每组数据,第一行是两个整数k,m(0 < k < 100,0 < m < k*k),表示有m条边,k个顶点。 下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。
Output
输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示DFS的遍历结果。
Example Input
1 4 4 0 1 0 2 0 3 2 3
Example Output
0 1 2 3
#include<iostream>
#include<cstring>
using namespace std;
int map[100][100],path[10000],visit[10000]={0},l=1,n,m;
void DFS(int st,int ed)
{/*if(st==ed){for(int i=0;i<l-1;++i)cout<<path[i]<<' ';cout<<path[l-1]<<endl;}*/visit[st]=1;//标记已经访问过 for(int i=0;i<n;++i){if(!visit[i]&&map[st][i]){cout<<' '<<i; DFS(i,n-1);//--l;//visit[i]=0;//记忆化搜索 }}
}
int main()
{int t;cin>>t;while(t--){memset(visit,0,sizeof(visit));memset(map, 0, sizeof(map)); cin>>n>>m;for(int i=0;i<m;++i){int a,b;cin>>a>>b;map[a][b]=map[b][a]=1;}cout<<0;DFS(0,n-1);cout<<endl; }return 0;
}
2018/03/25更新java代码
public class Main {private static int[][] go = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; // 上下左右public static int m = 0, n = 0, s = 0;private static int[][] vis = new int[10][10];public static void main(String[] args) {int N;Scanner sc = new Scanner(System.in);N = sc.nextInt();for (int i = 0; i < N; i++) {init();m = sc.nextInt();n = sc.nextInt();int[][] a = new int[m][n];for (int i1 = 0; i1 < m; i1++) {for (int j = 0; j < n; j++) {a[i1][j] = sc.nextInt();}}dfs(a, 0, 0);System.out.println(s);s = 0;}}private static void init() {for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {vis[i][j] = 0;}}}private static void dfs(int[][] a, int x, int y) {if (x == m - 1 && y == n - 1) {s++;return;} else { for (int i = 0; i < 4; i++) {int xx = x + go[i][0];int yy = y + go[i][1];if (xx >= 0 && xx < m && yy >= 0 && yy < n && vis[xx][yy] ==0 && a[xx][yy]==0) { x = xx;y = yy;System.out.println("x:"+x+"--"+"y:"+y);vis[x][y] = 1;dfs(a, x, y);System.out.println("yes I do "+x+'-'+y);vis[x][y] = 0;}}}}
}