zoukankan      html  css  js  c++  java
  • 数据结构与算法题目集(中文)7-6 列出连通集 (25分)

    1.题目

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

    输入格式:

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

    输出格式:

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

    2.题目分析

    题目就是考察深度优先遍历以及广度优先遍历的知识,题目中数据量不大,所以使用邻接矩阵实现

    注意的内容就是

    1.邻接矩阵的实现

    2.DFS、BFS的代码实现

    3.代码

    #include<iostream>
    #include<queue>
    using namespace std;
    typedef struct
    {
    	int n, e;
    	int edges[11][11];
    }MGraph;
    
    int allcount[11] = { 0 };
    int visited[11] = { 0 };
    #define INF 100000
    
    
    void DFS(MGraph g, int v)
    {
    
    	int w;
    	visited[v] = 1;
    	allcount[v] = 1;
    	cout << " "<<v;
    	for (w = 0; w < g.n; w++)
    	{
    		if (g.edges[v][w] != 0 && g.edges[v][w] != INF&&visited[w] == 0)
    		{
    			allcount[w] = 1;
    			DFS(g, w);
    		}
    	}
    
    
    }
    queue<int>qu;
    void BFS(MGraph g, int v)
    {
    	
    	int w, i;
    	visited[v] = 1;
    	allcount[v] = 1;
    	qu.push(v);
    	cout << " " << v;
    	while (!qu.empty())
    	{
    		w = qu.front(); qu.pop();
    		for(int i=0;i<g.n;i++)
    		if (g.edges[w][i] != 0 && g.edges[w][i] != INF&&visited[i] == 0)
    		{
    			visited[i] = 1;
    			allcount[i] = 1;
    			cout << " " << i;
    			qu.push(i);
    		}
    	
    	}
    }
    
    
    int main()
    {
    	MGraph g;
    	cin >> g.n >> g.e;
    	for (int i = 0; i < 11; i++)
    	{
    		for (int j = 0; j < 11; j++)
    		{
    			if (i == j)
                g.edges[i][j] = 0;
    			else
    			g.edges[i][j] = INF;
    		}
    	}
    
    	int a, b;
    	for (int i = 0; i < g.e; i++)
    	{
    		cin >> a >> b;
    		g.edges[a][b] = 1;
    		g.edges[b][a] = 1;
    	}
    	for (int i = 0; i < g.n; i++)
    	{
    		if (allcount[i] == 0)	
    		{
    			cout << '{';
    			DFS(g, i);
    			cout << " }" << endl;
    		}
    	}
    
    	for (int i = 0; i <11; i++)
    	{
    		visited[i] = 0;
    		allcount[i] = 0;
    	}
    	for (int i = 0; i < g.n; i++)
    	{
    		if (allcount[i] == 0)
    		{
    			cout << '{';
    			BFS(g, i);
    			cout << " }" << endl;
    		}
    	}
    
    }

    4.附上原题备用

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

    输入格式:

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

    输出格式:

    按照"{ v​1​​ 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 }
  • 相关阅读:
    git
    sublime text
    WIX安装图文并茂简易说明
    C#利用Lambda和Expression实现数据的动态绑定
    Ubuntu/CentOS下如何将普通用户提升到root权限
    虚拟机安装CentOS6.4用“桥接:直接连接到物理网线”不能上网的原因及解决方法
    C#利用lambda表达式将函数作为参数或属性跨类传递
    直接将XML存入到SQL中(SQL2008)
    C# 类中继承接口的属性
    提高开发效率的Visual Studio 2010使用技巧
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12789029.html
Copyright © 2011-2022 走看看