06-图1 列出连通集 (25分)
2016-05-29 22:25
555 查看
题目输入:
第一行:给出N个顶点,E条边
以下E行给出每条边的两个端点
题目输出:
分别输出DFS、BFS的结果
代码如下:
#include<stdio.h> #include<stdlib.h> #define MaxVertexNum 10 #define true 1 #define false 0 typedef int Bool; typedef int Vertex; typedef struct GNode *PtrToGNode; struct GNode{ int Nv; int Ne; int G[MaxVertexNum][MaxVertexNum]; }; typedef PtrToGNode MGraph; typedef struct QNode{ Vertex *Data; int front; int rear; }Queue; Queue *CreateQueue(int); void Enqueue(Queue *,Vertex); int Dequeue(Queue *); Bool TAG=false; Bool Visited[MaxVertexNum]; MGraph CreateGraph(int,int); void DFS(MGraph,Vertex); void BFS(MGraph,Vertex,Queue *); void ResetVisit(MGraph,Bool *); int main() { int N,E; scanf("%d %d",&N,&E); MGraph G=CreateGraph(N,E); int i; for(i=0;i<N;i++) { if(Visited[i]==false) { DFS(G,i); printf("}"); printf("\n"); TAG=false; } } ResetVisit(G,Visited); Queue *PtrQ=CreateQueue(MaxVertexNum); for(i=0;i<N;i++) { if(Visited[i]==false) { BFS(G,i,PtrQ); printf("}"); printf("\n"); TAG=false; } } return 0; } void ResetVisit(MGraph Graph,Bool *Visit) { TAG=false; Vertex V,W; for(V=0;V<Graph->Nv;V++) { Visit[V]=false; } } MGraph CreateGraph(int N,int E) { MGraph Graph; Graph=(MGraph)malloc(sizeof(struct GNode)); Graph->Nv=N; Graph->Ne=E; int i; int n,e; Vertex V,W; for(V=0;V<N;V++) { for(W=0;W<N;W++) { Graph->G[V][W]=0; } Visited[V]=false; } for(i=0;i<E;i++) { scanf("%d %d",&n,&e); Graph->G [e]=1; Graph->G[e] =1; } return Graph; } void DFS(MGraph Graph,Vertex V) { if(TAG==false) { TAG=true; printf("{ "); } printf("%d ",V); int i; Visited[V]=true; for(i=0;i<Graph->Nv;i++) { if(Graph->G[V][i]!=0&&Visited[i]==false) { DFS(Graph,i); } } } Queue *CreateQueue(int M) { Queue *PtrQ=(Queue *)malloc(sizeof(Queue)); PtrQ->Data=(Vertex *)malloc(M*sizeof(Vertex)); PtrQ->front=PtrQ->rear=-1; return PtrQ; } Bool IsFull(Queue *PtrQ) { Bool full=false; if((PtrQ->rear+1)%MaxVertexNum==PtrQ->front) { full=true; } return full; } Bool IsEmpty(Queue *PtrQ) { Bool empty=false; if(PtrQ->front==PtrQ->rear) { empty=true; } return empty; } void Enqueue(Queue *PtrQ,Vertex V) { if(!IsFull(PtrQ)) { PtrQ->rear=(PtrQ->rear+1)%MaxVertexNum; PtrQ->Data[PtrQ->rear]=V; } } int Dequeue(Queue *PtrQ) { if(!IsEmpty(PtrQ)) { PtrQ->front=(PtrQ->front+1)%MaxVertexNum; return PtrQ->Data[PtrQ->front]; } } void BFS(MGraph Graph,Vertex nv,Queue *PtrQ) { Vertex V,W; if(TAG==false) { TAG=true; printf("{ "); } printf("%d ",nv); Visited[nv]=true; Enqueue(PtrQ,nv); while(!IsEmpty(PtrQ)) { V=Dequeue(PtrQ); for(W=0;W<Graph->Nv;W++) { if(Visited[W]==false&&Graph->G[V][W]!=0) { printf("%d ",W); Visited[W]=true; Enqueue(PtrQ,W); } } } }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- 渗透技术一瞥(图)
- 图片引发的溢出危机(图)
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例