列出联通集
程序自己测试没问题,为什么通过PTA呢?悲伤
06-图1 列出连通集 (25分)
给定一个有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 }
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 10
int visit[MAXN];
typedef struct Node *PtrToNode;
typedef PtrToNode Position;
typedef struct QNode *Queue;
struct Node { /* 队列中的结点 */
int Data;
PtrToNode Next;
};
struct QNode {
Position Front, Rear; /* 队列的头、尾指针 */
};
typedef struct ENode* Edge;
struct ENode {
int V1, V2;
};
typedef struct AdjNode* PtrA;
struct AdjNode {
int V;
PtrA Next;
};
typedef struct VNode {
PtrA FirstEdge;
}AdjList[MAXN];
typedef struct GNode *Graph;
struct GNode {
int Nv, Ne;
AdjList GList;
};
Graph CreateGraph(int n) {
int v;
Graph G = (Graph)malloc(sizeof(struct GNode));
G->Nv = n;
G->Ne = 0;
for(v = 0; v < n; v++)
G->GList[v].FirstEdge = NULL;
return G;
}
void InsertEdge(Graph G, Edge E) {
PtrA newnode = (PtrA)malloc(sizeof(struct AdjNode));
newnode->V = E->V2;
newnode->Next = G->GList[E->V1].FirstEdge;
G->GList[E->V1].FirstEdge = newnode;
newnode = (PtrA)malloc(sizeof(struct AdjNode));
newnode->V = E->V1;
newnode->Next = G->GList[E->V2].FirstEdge;
G->GList[E->V2].FirstEdge = newnode;
}
void DFS(Graph G, int V) {
PtrA W;
printf(" %d",V);
visit[V]=1;
for(W = G->GList[V].FirstEdge; W; W = W->Next)
if(!visit[W->V])
DFS(G, W->V);
};
int DeleteQ( Queue Q )
{ /*出队列*/
Position FrontCell;
int m;
FrontCell = Q->Front;
if ( Q->Front == Q->Rear ) /* 若队列只有一个元素 */
Q->Front = Q->Rear = NULL; /* 删除后队列置为空 */
else
Q->Front = Q->Front->Next;
m = FrontCell->Data;
free( FrontCell ); /* 释放被删除结点空间 */
return m;
}
Queue CreatQueue()
{
/*建立一个新的队列*/
Queue Q;
Q=(Queue)malloc(sizeof(struct QNode));
Q->Front=NULL;
Q->Rear=NULL;
return Q;
}
void AddQ( Queue Q ,int m)
{
/*入队列*/
PtrToNode que;
que=(PtrToNode)malloc(sizeof (struct Node));
que->Data=m;
que->Next=NULL;
if (Q->Front==NULL){
Q->Front=que;
Q->Rear=que;
}
else {
Q->Rear->Next=que;
Q->Rear=que;
}
}
int IsEmpty(Queue Q)
{
/*判断队首或队尾任一个指针是否为空即可*/
if(Q->Front==NULL)
return 1;
else
return 0;
}
void BFS(Graph G,int V)
{
PtrA W;
int T,ss;
Queue Q;
Q=CreatQueue();
printf(" %d",V);
visit[V]=1;
AddQ(Q,V);
while(!IsEmpty(Q)){
T=DeleteQ(Q);
for(W = G->GList[T].FirstEdge; W; W = W->Next)
{
ss=W->V;
if(!visit[ss]) {
printf("%2d",ss);
visit[ss]=1;
AddQ(Q,ss);
}
}
}
}
int main() {
int n, i;
Graph G;
Edge E;
memset(visit, 0, sizeof(visit));
scanf("%d", &n);
G = CreateGraph(n);
scanf("%d", &G->Ne);
if(G->Ne) {
E = (Edge)malloc(sizeof(struct ENode));
for(i = 0; i < G->Ne; i++) {
scanf("%d%d", &E->V1, &E->V2);
InsertEdge(G, E);
}
}
for(i=0;i<n;i++)
{
if(!visit[i])
{
printf("{");
DFS(G, i);
printf(" }");
printf("\n");
}
}
for(i=0;i<MAXN;i++)
visit[i]=0;
for(i=0;i<n;i++)
{
if(!visit[i])
{
printf("{");
BFS(G, i);
printf(" }");
printf("\n");
}
}
return 0;
}运行结果:
生命之树常青葱,而理论总朦胧!

浙公网安备 33010602011771号