列出连通集——DFS+BFS

    xiaoxiao2021-03-25  113

    think: 1深度优先搜索体现了递归的思想,广度优先搜索体现了队列的思想

    6 列出连通集 (25分)

    给定一个有NNN个顶点和EEE条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1N-1N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

    输入格式: 输入第1行给出2个整数NNN(0

    测试点1 答案正确 15/15 2 1 sample 两种顺序不同,也有相同,有未出现的单个顶点 测试点2 答案正确 8/8 1 11个是单独点,最大N 测试点3 答案正确 2/2 18 1 NE最小

    以下为答案正确代码

    #include <stdio.h> #include <string.h> int vis[14], e[14][14], link[14], op, tp; void DFS(int x, int n);//深度优先搜索 void BFS(int x, int n);//广度优先搜索 int main() { int n, m, u, v, i; while(scanf("%d %d", &n, &m) != EOF) { memset(vis, 0, sizeof(vis));//vis数组初始化(vis数组标记当前结点是否被访问过) memset(e, 0, sizeof(e));//e数组初始化(e数组记录结点之间是否存在路径) for(i = 0; i < m; i++) { scanf("%d %d", &u, &v); e[u][v] = e[v][u] = 1; } for(i = 0; i < n; i++) { if(vis[i] == 0) { printf("{"); DFS(i, n);//深度优先搜索 printf(" }\n"); } } op = tp = 0;//队列标记变量初始化 memset(vis, 0, sizeof(vis));//vis数组初始化(vis数组标记当前结点是否被访问过) for(i = 0; i< n; i++) { if(vis[i] == 0) { printf("{"); BFS(i, n);//广度优先搜索 printf(" }\n"); } } } return 0; } void DFS(int x, int n)//深度优先搜索 { int i; printf(" %d", x); vis[x] = 1; for(i = 0; i < n; i++) { if(vis[i] == 0 && e[x][i] == 1) { DFS(i, n);//深度优先搜索(递归思想) } } } void BFS(int x, int n)//广度优先搜索(队列思想) { int i, f1; link[tp++] = x;//当前结点入队 vis[x] = 1; while(op < tp) { f1 = link[op++];//头结点出队 printf(" %d", f1); for(i = 0; i < n; i++) { if(vis[i] == 0 && e[f1][i] == 1) { vis[i] = 1; link[tp++] = i;//当前结点入队 } } } }
    转载请注明原文地址: https://ju.6miu.com/read-10003.html

    最新回复(0)