• 数据结构与算法题目集(中文)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 }
  • 相关阅读:
    我的第一个NHibernate示例
    Div+CSS实现表格滚动,JS隐藏和显示Div例子
    VUE 生命周期
    sql AND和OR
    vcloak 隐藏表达式
    sql 多表联查
    SQL 语句解析
    jenkins 使用
    sql 排序(order by)
    sql 基础查询
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12789029.html
Copyright © 2020-2023  润新知