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}
考え方の解答:図のは基本的な操作を遍歴します.
コードの詳細:
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)と図の概念を理解する.