06-图1 列出连通集
2016-11-10 19:14
211 查看
题意:
用DFS 和 BFS 分别输出
题目数据不大,用二维数组存即可,递归时候找到递归边界就好,实则不难。
题目链接:https://pta.patest.cn/pta/test/1342/exam/4/question/22500
//用二维数组来存 #include<cstdio> #include<queue> #define MAXN 11 using namespace std; int N, E; int pic[MAXN][MAXN];//初始化为0, 即不连通 int pic2[MAXN][MAXN];//初始化为0, 即不连通 queue<int> q; void set2(int i, int j){ for(int k = 0 ; k < N; ++k){ pic[k][i] = 0; pic[k][j] = 0; } } void dfs(int x){ if(x >= N) return ; for(int i = 0; i < N ; ++i){ if(pic[x][i] == 1){ printf(" %d", i); set2(x, i); dfs(i); } } } void set0(int i){ for(int k = 0 ; k < N; ++k){ pic2[k][i] = 0; } } void bfs(int i){ set0(i); q.push(i); int k; while(!q.empty()){ k = q.front(); printf(" %d", k); q.pop(); for(int j = 0; j < N; ++j){ if(pic2[k][j] == 2){ set0(j); q.push(j); } } } } int main(void){ int x, y; int i, j; scanf("%d%d", &N, &E); for(i = 0; i < E; ++i){ scanf("%d%d", &x, &y); pic[x][y] = 1; pic[y][x] = 1; pic2[x][y] = 2; pic2[y][x] = 2; } for(i = 0; i < N; ++i){ for( j = 0; j < N; ++j){ if(i == j){ pic[i][j] = 1; pic2[i][j] = 2; } } } //DFS for(i = 0 ; i < N; ++i){ for(j = 0; j < N; ++j){ if(pic[i][j] == 1){ printf("{ %d", i); set2(i, j); dfs(j); printf(" }\n"); } } } //BFS for(i = 0 ; i < N; ++i){ for(j = 0; j < N; ++j){ if(pic2[i][j] == 2){ printf("{"); bfs(i); printf(" }\n"); } } } return 0; }
相关文章推荐
- 06-图1 列出连通集
- 06-图1 列出连通集
- 图的基本操作:建立图,DFS,BFS-06-图1 列出连通集
- PAT 06-图1:列出连通集 (Java实现)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集
- 5-6 列出连通集
- 06-图1 列出连通集
- 06-图1 列出连通集 (25分)
- 图论BFS DFS 列出连通集
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- PTA - - 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集
- 06-图1 列出连通集
- 06-图1 列出连通集 (25分)