06-図1には、連続セット(lists the connectivity set)が一覧表示されています.


タイトル:Ginven one hasN vertices and For the undirected graphh of the E side、please list all connected sets with DFS and BFS rectively.Suppose the vertices from 0 toN−1 number.When searching、let’s assiume that we always start from the lowest numberd vertex and access the neighbors in increase order of numbers.N個の頂点とEストリップがある無方向図を与えられました.DFSとBFSでそれぞれそのすべての接続セットをリストしてください.頂点が0からN−1までの番号を仮定します.検索を行う場合、常に番号の一番小さい頂点から出発し、番号の増分順で隣接点にアクセスすると仮定します.
Input format:入力フォーマット:Enter line 1 to give 2 integersN(0<N≦1)and E is the number of vertices and the number of the graph.SubsequentlyLine、each line gives two endpoints of edge.The paress入力整数
Output format:出力フォーマット:accoding to「{v 1,v 2...v k]」「format,each line of output set of a communication.DFS first output,and then output the relt of the BFS.」{v 1,v 2...v}の形式でFSを出力します.
Input example:入力サンプル例:8 6 0 7 1 2 0 1 4 1 2 4 5
Sample output:出力サンプル例:{0 1 4 2 7}{3}{6}{0 1 2 7}{3}{6}
考え方の解答:図のは基本的な操作を遍歴します.
コードの詳細:
#include
#include
#define Maxsize 100
struct ENode{
	int v1,v2;
};//  
typedef struct ENode *Edge;
struct Gnode{
	int topnum;
	int edgenum;
	int G[Maxsize][Maxsize];
	int Data[Maxsize];
};//  
int queue[Maxsize];//   
int front = -1;
int rear = -1;
typedef struct Gnode *Graph;
void InsertEdge(Graph graphptr,Edge E); //   
void DFS(Graph graphptr,int v,int *);//     
void BFS(Graph graphptr,int v,int *);//     
int main()
{
	Graph graphptr = (Graph)malloc(sizeof(struct Gnode));
	scanf("%d",&graphptr->topnum);
	scanf("%d",&graphptr->edgenum);
	int v,w,flag = 0,visited[graphptr->topnum] = {0};//    
	Edge E ;
	for(v = 0; v <= graphptr->topnum - 1;v ++)
		for(w = 0;w <= graphptr->topnum - 1;w ++)
			graphptr->G[v][w] = 0; //    
	if(graphptr->edgenum != 0)
	{
		E = (Edge)malloc(sizeof(struct ENode));
		for(v = 0; v <= graphptr->edgenum - 1;v++)
		{
			scanf("%d %d",&E->v1,&E->v2);//       
			InsertEdge(graphptr,E); 
		} 
	}
	for(v = 0;v <= graphptr->topnum - 1;v++)
	{
		if( !visited[v] )//   
		{
			printf("{ ");
			DFS(graphptr,v,visited);
			printf("}
"
); } } for(v = 0;v <=graphptr->topnum - 1;v ++)// visited[v] = 0; for(v = 0;v <= graphptr->topnum - 1;v++) { if( !visited[v] )// , , { printf("{ "); BFS(graphptr,v,visited); printf("}
"
); } } return 0; } void InsertEdge(Graph graphptr,Edge E) { graphptr->G[E->v1][E->v2] = 1;// graphptr->G[E->v2][E->v1] = 1; } void DFS(Graph graphptr,int v,int visited[]) { visited[v] = 1; printf("%d ",v);// , for(int w = 0;w <= graphptr->topnum - 1;w ++) { if( graphptr->G[v][w] && !visited[w])// , DFS( graphptr,w , visited ); } return ; } void BFS(Graph graphptr,int v,int visited[]) { int w = 0,i = 0; visited[v] = 1; queue[++rear] = v;// while(front != rear) { w = queue[++front];// printf("%d ",w); for(i = 0;i <=graphptr->topnum - 1;i++) { if( !visited[i] && graphptr->G[w][i])// , { visited[i] = 1;// queue[++rear] = i;// } } } }
これらの二つの方法が分からない場合、クリックして図の遍歴+深さ優先+広さ優先(Graph)と図の概念を理解する.