您的位置:首页 > 其它

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空格分隔。

输出格式:

按照”{ 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 }


思路

关于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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BFS DFS 连通集