5-6 列出连通集 (25分)
2016-08-26 07:55
417 查看
5-6 列出连通集 (25分)
给定一个有N个顶点和EEE条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。输入格式:
输入第1行给出2个整数N( 0 < N ≤ 10 )和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式:
按照”{ v1v2...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 }
思路
关于BFS(广度优先搜索) DFS(深度优先搜索),你可以在其他博客找到深入详细的介绍。
点击访问 PTA-测验
#include <stdio.h> #include <stdlib.h> /*评测结果 时间 结果 得分 题目 编译器 用时(ms) 内存(MB) 用户 2016-02-13 23:26 部分正确 17 5-6 gcc 13 1 569985011 测试点结果 测试点 结果 得分/满分 用时(ms) 内存(MB) 测试点1 答案正确 15/15 1 1 测试点2 答案正确 8/8 13 1 测试点3 答案正确 2/2 1 1 */ typedef struct LNode *Vertex; struct LNode { int Data; int Flag; Vertex Next; }; Vertex CreatV(int); int InsertV(Vertex,int); void DFS(Vertex,int,int); void BFS(Vertex,int,int); int main() { int N,E; scanf("%d%d",&N,&E); int from,to; Vertex V=CreatV(N); for(int i=0; i<E; i++) { scanf("%d%d",&from,&to); InsertV(&V[to],from); InsertV(&V[from],to); } // for(int i=0; i<N; i++) { // printf("%d:",i); // Vertex temp=V[i].Next; // while(temp) { // printf(" %d",temp->Data); // temp=temp->Next; // } // printf("\n"); // } for(int i=0; i<N; i++) { if(!V[i].Flag) { V[i].Flag=1; printf("{"); printf(" %d",i); DFS(V,N,i); printf(" }\n"); } } for(int i=0;i<N;i++)V[i].Flag=0; for(int i=0; i<N; i++) { if(!V[i].Flag) { V[i].Flag=1; printf("{"); printf(" %d",i); BFS(V,N,i); printf(" }\n"); } } } void BFS(Vertex V,int n,int key) { int a[10]; int left=-1,right=0; while(left!=right) { for(Vertex temp=V[key].Next; temp; temp=temp->Next) { int ConFlag=0; for(int i=0; i<right%10; i++) { if(a[i]==temp->Data) { ConFlag=1; break; } } if(ConFlag)continue; a[right++%10]=temp->Data; if(!V[temp->Data].Flag) printf(" %d",temp->Data); V[temp->Data].Flag=1; } key=a[++left%10]; } } void DFS(Vertex V,int n,int key) { if(!V) { return ; } Vertex temp=V[key].Next; while(temp) { if(!V[temp->Data].Flag) { printf(" %d",temp->Data); V[temp->Data].Flag=1; DFS(V,n,temp->Data); } temp=temp->Next; } return ; } Vertex CreatV(int num) { Vertex V=(Vertex)malloc(sizeof(struct LNode)*num); for(int i=0; i<num; i++) { V[i].Next=NULL; V[i].Flag=0; } return V; } int InsertV(Vertex V,int X) { if(!V)return 0; while(V->Next&&V->Next->Data<X)V=V->Next; Vertex temp=(V->Next)?V->Next:NULL; V->Next=(Vertex)malloc(sizeof(struct LNode)); V->Next->Data=X; V->Next->Next=temp; // printf("in%d,",V->Next->Data); return 1; }
相关文章推荐
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 5-6 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 5-1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- MOOC浙大数据结构 — 06-图1 列出连通集 (25分)
- PTA - - 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 5-6 列出连通集(25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分) C++
- 06-图1 列出连通集 (25分)