zoukankan      html  css  js  c++  java
  • 图1 列出连通集

    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

    输入格式:

    输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

    输出格式:

    按照"{ 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 }

    我的代码(g++6.5.0)

    #include <iostream>
    
    #define MaxVertexNum 10
    typedef int Vertex;         /* 用顶点下标表示顶点,为整型 */
    typedef int WeightType;        /* 边的权值设为整型 */
    
    typedef struct GNode *PtrToGNode;
    struct GNode {
    	int Nv;  /* 顶点数 */
    	int Ne;  /* 边数   */
    	WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
    };
    typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
    
    MGraph createGraph(int VertexNum) {
    	Vertex V, W;
    	MGraph Graph = (MGraph)malloc(sizeof(struct GNode));  //建立图
    	Graph->Nv = VertexNum;
    	Graph->Ne = 0;
    	/* 初始化邻接矩阵 */
    	/* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */
    	for (V = 0; V < Graph->Nv; V++)
    		for (W = 0; W < Graph->Nv; W++)
    			Graph->G[V][W] = 0; //初始0,表示顶点间无边
    
    	return Graph;
    }
    void insertEdge(MGraph Graph,Vertex V, Vertex W) {
    	Graph->G[V][W] = 1; //1表示两个顶点间存在边
    	Graph->G[W][V] = 1;
    }
    
    typedef struct Queue *PtrToQueue;
    struct Queue {
    	int Front;
    	int Rear;
    	int maxSize;
    	Vertex Arr[MaxVertexNum+1]; //留一空间不存储数据,仅用于判断是否为空
    };
    typedef PtrToQueue Que;
    
    Que createQue() { //用循环数组表示队列
    	Que Q = (Que)malloc(sizeof(struct Queue));  //建立队列
    	Q->maxSize = MaxVertexNum+1;
    	Q->Front = 0;
    	Q->Rear = 0;
    	return Q;
    }
    bool QueIsFull(Que Q) {
    	if ((Q->Rear + 1)%Q->maxSize == Q->Front) return true;
    	else return false;
    }
    bool QueIsEmpty(Que Q) {
    	if (Q->Rear == Q->Front) return true;
    	else return false;
    }
    
    void EnterQue(Que Q, Vertex V) {
    	if (QueIsFull(Q)) return;
    	Q->Rear = (Q->Rear + 1) % Q->maxSize;
    	Q->Arr[Q->Rear] = V;
    }
    Vertex DelQue(Que Q) {
    	if (QueIsEmpty(Q)) return -1;
    	Q->Front = (Q->Front + 1) % Q->maxSize;
    	return Q->Arr[Q->Front];
    }
    Vertex visited[MaxVertexNum]; //记录已被遍历的节点
    
    void DFS(MGraph Graph, Vertex V) {
    	visited[V] = true;
    	printf(" %d",V);
    	for (Vertex W = 0; W < MaxVertexNum;W++) {
    		if (Graph->G[V][W] == 1 && !visited[W])
    			DFS(Graph,W);
    	}
    }
    void BFS(MGraph Graph,Vertex V,Que Q) {
    	visited[V] = true;
    	EnterQue(Q,V);
    	while (!QueIsEmpty(Q)) {
    		Vertex W = DelQue(Q);
    		printf(" %d", W);
    		for (Vertex U= 0; U < MaxVertexNum; U++) {
    			if (Graph->G[W][U] == 1 && !visited[U]) {
    				visited[U] = true;
    				EnterQue(Q, U);
    			}
    		}
    	}
    }
    
    int main()
    {	
    	int N,E;
    	int i;
    	scanf("%d %d
    ",&N,&E);
        //rewind(stdin); //清空键盘文件缓存,用于VS调试,待删除
    	MGraph Graph = createGraph(N);
    	Que Q = createQue();
    	for (i = 0; i < E;i++) {
    		Vertex V, W;
    		scanf("%d %d
    ", &V, &W);
    		insertEdge(Graph, V, W);
             //rewind(stdin); //清空键盘文件缓存,用于VS调试,待删除
    	}
    	for (i = 0; i < N;i++) {
    		if (visited[i] == false) {
    			printf("{");
    			DFS(Graph,i);
    			printf(" }
    ");
    		}
    	}
    	for (i = 0; i < N; i++) visited[i] = false; //重新初始化visited数组值为false
    	for (i = 0; i < N; i++) {
    		if (visited[i] == false) {
    			printf("{");
    			BFS(Graph, i, Q);
    			printf(" }
    ");
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    给你一个亿-电视节目总结
    给你一个亿-电视节目总结
    我的写作、爱好和好友
    我的写作、爱好和好友
    互联网和移动互联网怎么挣钱?
    互联网和移动互联网怎么挣钱?
    IT人都很忙(茫)
    Java实现 LeetCode 345 反转字符串中的元音字母
    Java实现 蓝桥杯 算法训练 谁干的好事?
    Java实现 蓝桥杯 算法训练 谁干的好事?
  • 原文地址:https://www.cnblogs.com/TangYJHappen/p/13321976.html
Copyright © 2011-2022 走看看