【图】遍历图DFS,BFS 列出连通集
一、题目 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式 输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式 按照"{ v1 v2…vk }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。
输入样例
8 6 0 7 0 1 2 0 4 1 2 4 3 5
输出样例
{ 0 1 4 2 7 } { 3 5 } { 6 } { 0 1 2 7 4 } { 3 5 } { 6 }
二。思路
- 根据输入信息建立图的邻接表
- 分别DFS,BFS遍历 (图的DFS和BFS:)
- 其中DFS时,每次都要找该与顶点有关的最小的边节点信息。BFS时要对该顶点的边表节点里存储的下标进行从小到大排序,排好序然后再依次入队。
- 图并不是全部连通,要找到一些没有被访问到的顶点,然后依次对这些进行访问。
三、代码 代码中的p->next所对应的下标就等于G->adjlist[p->next].data。DFS遍历时用的是后面那种麻烦的表达,BFS时嫌麻烦用的是前者。但是数值都一样,用哪种表达都不影响。
#include<iostream> #include<algorithm> #include<string.h> #define maxsize 10 using namespace std; int visit[maxsize]; typedef struct ArcNode //边表,存放边信息 { int index; struct ArcNode *next; }ArcNode; typedef struct VNode { int data; ArcNode *firstarc; }VNode; typedef struct AGraph { VNode adjlist[maxsize]; int n, e; }AGraph; void DFS(AGraph *G, int v) { cout << " " << G->adjlist[v].data; visit[v] = 1; ArcNode *p,*q; p = G->adjlist[v].firstarc; while (p != NULL) { int min = G->adjlist[p->index].data; q = p; int flag = 0; while (q != NULL) { if (min > G->adjlist[q->index].data && visit[q->index] == 0) { min = G->adjlist[q->index].data; flag = 1; } q = q->next; } if(visit[min]==0) DFS(G, min); if(flag==0) p = p->next; } } void BFS(AGraph *G, int v) { ArcNode *p,*q; int que[maxsize]; int front = -1, rear = -1; visit[v] = 1; int j; rear = (rear + 1) % maxsize; que[rear] = v; while (front != rear) { front = (front + 1) % maxsize; j = que[front]; cout << " " << G->adjlist[j].data; p = G->adjlist[j].firstarc; q = p; int arry[maxsize]; int k = 0; while (q != NULL) { if (visit[q->index] == 0) { arry[k++] = q->index; visit[q->index] = 1; } q = q->next; } sort(arry, arry + k); for (int n = 0; n < k; n++) { rear = (rear + 1) % maxsize; que[rear] = arry[n]; } } } void initial(AGraph *&g) { for (int i = 0; i < maxsize; i++) { g->adjlist[i].firstarc = NULL; g->adjlist[i].data = i; } } int main() { memset(visit, 0, sizeof(visit)); int N, E; int a[3]; cin >> N >> E; AGraph *g; g = (AGraph*)malloc(sizeof(AGraph)); initial(g); g->n = N; g->e = E; for (int i = 0; i < E; i++) { cin >> a[0] >> a[1]; for (int j = 0; j < 2; j++) { ArcNode *p, *q; p = (ArcNode*)malloc(sizeof(ArcNode)); p->index = a[(j+1)%2]; p->next = NULL; if (g->adjlist[a[j]].firstarc == NULL) { g->adjlist[a[j]].firstarc = p; continue; } q = g->adjlist[a[j]].firstarc; while (q->next != NULL) { q = q->next; } q->next = p; } } for (int i = 0; i < N; i++) { if (visit[i] == 0) { cout << "{"; DFS(g, i); cout << " }" << endl; } } memset(visit, 0, sizeof(visit)); for (int i = 0; i < N; i++) { if (visit[i] == 0) { cout << "{"; BFS(g, i); cout << " }" << endl; } } return 0; }
下一篇:
aksk生成工具类及加密算法