7-6 列出连通集 (25分)

7-6 列出连通集 (25分)_第1张图片

输入样例:

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
#include
#include
#define  Max  10
typedef struct Gnode* ptrtoG;
struct Gnode{
	int nv,ne;
	int G[Max][Max];
};
int state[Max]={0};
ptrtoG create(int N,int E)
{
	ptrtoG G;
	G=(ptrtoG)malloc(sizeof(struct Gnode));
	G->nv=N;
	G->ne=E;
	int i,j,a,b;
	for(i=0;i<Max;i++)
	{
		for(j=0;j<Max;j++)
		{
			G->G[i][j]=0;
		}
	}
	for(i=0;i<E;i++)
	{
		scanf("%d%d",&a,&b);
		G->G[a][b]=G->G[b][a]=1;
	}
	return G;
}
void DFS(ptrtoG G,int n)
{
	int i;
	printf(" %d",n);
	state[n]=1;
	for(i=0;i<G->nv;i++)
	{
		if(G->G[n][i]&&!state[i])
		{
			DFS(G,i);
		}
	}
}
void DFSshow(ptrtoG G)
{
	int i;
	while(1)
	{
		for(i=0;i<G->nv;i++)
		{
			if(!state[i])
			break;
		}
		if(i==G->nv)
		break;
		printf("{");
		DFS(G,i);
		printf(" }\n");
	}
}
void BFS(ptrtoG G,int n)
{
	int queue[500];
	int front=0,rear=0;
	queue[++rear]=n;
	state[n]=1;
	while(front!=rear)
	{
		int t=queue[++front];
		printf(" %d",t);
		int i;
		for(i=0;i<G->nv;i++)
		{
			if(G->G[t][i]&&!state[i])
			{
				queue[++rear]=i;
				state[i]=1;
			}
		}
	}
}
void BFSshow(ptrtoG G)
{
	int i;
	while(1)
	{
		for(i=0;i<G->nv;i++)
		{
			if(!state[i])
			break;
		}
		if(i==G->nv)
		break;
		printf("{");
		BFS(G,i);
		printf(" }\n");
	}
}
int main()
{
	int N,E,i;
	scanf("%d%d",&N,&E);
	ptrtoG G;
	G=create(N,E);
	DFSshow(G);
	for(i=0;i<Max;i++)
	{
		state[i]=0;
	}
	BFSshow(G);
	
	return 0;
}
 

你可能感兴趣的:(7-6 列出连通集 (25分))