(c 언어 상세 설명) 06 - 그림 1 은 연결 집합 을 보 여 줍 니 다 (상세 설명)
31609 단어 저장 성
입력 형식: 첫 번 째 줄 을 입력 하여 정수 N 2 개 (0)
출력 형식: "{v1, v 2... v, k}" 형식 으로 줄 마다 연결 집합 을 출력 합 니 다. 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 }
분석 삼판 도끼
주제 에 대면 하 다.
이 문 제 는 무 방향 그림, 즉 가중치 가 기본 값 으로 1 이 될 수도 있 고 설정 하지 않 을 수도 있 습 니 다. 그림 (위) 의 첫 번 째 문제 이기 때문에 당황 하지 마 세 요. 우 리 는 첫 번 째 줄 이 그림 의 정점 과 그림 의 변 을 다시 분석 하고 정점 과 변 이 확정 되 었 습 니 다. 다음은 변 만 삽입 하면 됩 니 다. 변 을 삽입 하 는 것 은 두 가지 값 입 니 다. 예 를 들 어:
0 6
0 점 과 6 점 의 관 계 를 설정 해 야 한 다 는 뜻 입 니 다. 제목 에는 DFS 와 BFS 가 명확 합 니 다. 그래서 이것 은 전형 적 인 그림 을 옮 겨 다 니 며 연결 집합 을 찾 는 문제 입 니 다.
입 출력
한 문 제 를 해결 하기 위해 연구 해 야 할 알고리즘 을 고려 하면 반드시 입력, 처리, 출력 이 어야 합 니 다. 입력 은 BuildGraph 라 는 함 수 를 실현 시 키 는 것 입 니 다. 주로 노드 를 저장 하면 됩 니 다. 데 이 터 는 필요 하지 않 습 니 다. 그리고 심층 검색 과 광 검색 실현 에서 문제 의 요 구 를 굳 게 잡 고 ListComponents 함수 에 있어 서 형식 을 조정 하 십시오. 모든 가장 핵심 적 인 코드 는 수업 시간 에 강의 합 니 다.지나 간 것 은 맞 추고 정리 하 는 것 을 배 웁 니 다. 깊 은 검색 과 넓 은 검색 은 사상 이 중요 합 니 다. 사상 을 파악 하면 많은 문 제 를 해결 할 수 있 기 때 문 입 니 다. 억지로 옮 기 면 많은 결 과 를 잃 게 됩 니 다.
전체 코드 는 다음 과 같 습 니 다:
#include
#include
#define MaxVertexNum 10
#define MaxSize 10
typedef int WeightType;
typedef int Vertex;
typedef int ElementType;
int Visited_DFS[MaxVertexNum];
int Visited_BFS[MaxVertexNum];
struct GNode {
int Nv;
int Ne;
WeightType G[MaxVertexNum][MaxVertexNum];
};
typedef struct GNode* PtrToGNode;
typedef PtrToGNode MGraph;
struct ENode {
Vertex V1,V2;
WeightType Weight;
};
typedef struct ENode* PtrToENode;
typedef PtrToENode Edge;
struct Node {
ElementType Data;
struct Node* Next;
};
struct QNode {
struct Node* front;
struct Node* rear;
};
typedef struct QNode* Queue;
MGraph CreateGraph(int VertexNum);
void InsertEdge(MGraph,Edge E);
MGraph BuildGraph();
void Visit(Vertex V);
void DFS(MGraph Graph,Vertex V,void (*Visit)(Vertex));
void BFS(MGraph Graph,Vertex S,void (*Visit)(Vertex));
void ListComponents_DFS(MGraph Graph);
void ListComponents_BFS(MGraph Graph);
Queue CreateQueue();
void AddQ(Queue Q,Vertex S);
ElementType DeleteQ(Queue Q);
int main()
{
Vertex V;
MGraph Graph = BuildGraph();
ListComponents_DFS(Graph);
ListComponents_BFS(Graph);
return 0;
}
//MGraph
MGraph CreateGraph(int VertexNum) {
Vertex V,W;
MGraph Graph;
Graph = (MGraph)malloc(sizeof(struct GNode));
Graph->Nv = VertexNum;
Graph->Ne = 0;
for(V=0;V<Graph->Nv;V++)
for(W=0;W<Graph->Nv;W++)
Graph->G[V][W]=0;
return Graph;
}
//MGraph
void InsertEdge(MGraph Graph,Edge E) {
Graph->G[E->V1][E->V2] = E->Weight;
Graph->G[E->V2][E->V1] = E->Weight;
}
// MGraph
MGraph BuildGraph() {
MGraph Graph;
Edge E;
Vertex V;
int Nv,i;
scanf("%d",&Nv);
Graph = CreateGraph(Nv);
scanf("%d",&(Graph->Ne));
if(Graph->Ne != 0) {
E = (Edge)malloc(sizeof(struct ENode));
for(i=0;i<Graph->Ne;i++) {
scanf("%d %d",&E->V1,&E->V2);
E->Weight = 1;
InsertEdge(Graph,E);
}
}
for(V=0;V<Graph->Nv;V++) {
Visited_BFS[V] = 0;
Visited_DFS[V] = 0;
}
return Graph;
}
//
void Visit(Vertex V) {
printf(" %d",V);
}
// DFS
void ListComponents_DFS(MGraph Graph) {
for(Vertex V=0;V<Graph->Nv;V++) {
if(!Visited_DFS[V]) {
printf("{");
DFS(Graph,V,Visit);
printf(" }");
printf("
");
}
}
}
// BFS
void ListComponents_BFS(MGraph Graph) {
for(Vertex V=0;V<Graph->Nv;V++) {
if(!Visited_BFS[V]) {
printf("{");
BFS(Graph,V,Visit);
printf(" }");
printf("
");
}
}
}
//DFS
void DFS(MGraph Graph, Vertex V, void (*Visit)(Vertex )) {
Vertex W;
Visited_DFS[V] = 1;
Visit(V);
for(W=0;W<Graph->Nv;W++)
if(Graph->G[V][W] == 1 && !Visited_DFS[W])
{
DFS(Graph, W, Visit);
}
}
void BFS(MGraph Graph,Vertex S,void (*Visit)(Vertex)) {
Queue Q;
Vertex V,W;
Q = CreateQueue();
Visit(S);
Visited_BFS[S] = 1;
AddQ(Q,S);
while(Q->front != NULL ) {
V = DeleteQ(Q);
for(W = 0;W<Graph->Nv;W++) {
if(Graph->G[V][W] == 1 && !Visited_BFS[W])
{
Visit(W);
Visited_BFS[W] = 1;
AddQ(Q,W);
}
}
}
}
//J ,
Queue CreateQueue(){
Queue Q;
Q=(Queue)malloc(sizeof(struct QNode));
Q->front=Q->rear=NULL;
return Q;
}
/* */
void AddQ(Queue Q,Vertex S){
struct Node *temp;
temp=(struct Node*)malloc(sizeof(struct Node));
temp->Data=S;
temp->Next=NULL;
if(Q->front==NULL){
Q->front=temp;
Q->rear=temp;
}
else{
Q->rear->Next=temp;
Q->rear=temp;
}
// return Q;
}
/* */
ElementType DeleteQ(Queue Q){
struct Node *FrontCell;
ElementType FrontElem;
if(Q->front==NULL){
return -1;
}
FrontCell=Q->front;
if(Q->front==Q->rear)
Q->front=Q->rear=NULL;
else Q->front=Q->front->Next;
FrontElem=FrontCell->Data;
free(FrontCell);
return FrontElem;
}