• [DOJ练习] 求一个无向图的连通分量(两种写法)


    已知无向图的顶点为字符型,要求采用邻接矩阵表示,图中顶点序号按字符顺序排列,从键盘输入图中顶点的个数、边的条数、顶点的信息和边的组成等。(注意:判断一个无向图是否连通) 求一个无向图的连通分量。

    输入描述

    第一行输入无向图的顶点数和边的条数,以空格隔开
    
    第二行输入每个顶点的数据,中间没有空格
    
    第三行输入每条边,每条边的格式为i  j,中间有空格,所有边占一行

    输出描述

    输出该无向图的连通分量,占一行

    输入样例

    5 5
    ABCDE
    0 1 0 4 1 2 2 3 3 4

    输出样例

    1

    写Graph类的话篇幅会很长,这里就用数组的形式模拟整个过程, 原理是一样的

    DFS写法

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    const int N = 1e5+10;
    int visit[N],h[N], e[N], ne[N], idx;
    
    void add(int a, int b)
    {
        e[idx] = b, ne[idx] = h[a], h[a] = idx++;
    }
    
    void dfs(int u)
    {
        visit[u] = true; //点u已经被遍历过
    
        for (int i = h[u]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (!visit[j]) dfs(j);
        }
    }
    
    int main()
    {
        int n,m;
        cin >> n >> m;
        
        string s;
        cin >> s;
        
        memset(h, -1, sizeof h);
        int a, b;
        for(int i = 0; i < m; i++){
            cin >> a >> b;
            add(a, b), add(b, a);
        }
        
        int res = 0;
        for(int i = 0; i < n; i++){
            if(!visit[i]){
                res ++;
                dfs(i);     
            }
        }
        cout << res;
        return 0;
    }

    BFS写法

    #include <iostream>
    #include <cstring> 
    using namespace std;
    
    const int N = 1e5+10;
    int h[N], e[N], ne[N], idx;
    int visit[N];
    void add(int a, int b)
    {
        e[idx] = b, ne[idx] = h[a], h[a] = idx++;
    }
    
    void bfs(int u)
    {
    	int q[N];
    	int front = -1, rear = -1;
    	q[++rear] = u;
    	visit[u] = 1;
    	
    	while(front != rear)
    	{
    		int t = q[++front];
    		for(int i = h[t]; i != -1; i = ne[i]){
    			int j = e[i];
    			if(!visit[j]){
    				visit[j] = 1;
    				q[++rear] = j;
    			}
    		}
    	}
    }
    int main()
    {
        int n,m;
        cin >> n >> m;
        
        string s;
        cin >> s;
        
        memset(h, -1, sizeof h);
        int a, b;
        for(int i = 0; i < m; i++){
            cin >> a >> b;
            add(a, b), add(b, a);
        }
        
        int res = 0;
        for(int i = 0; i < n; i++){   
            if(!visit[i]){
                res ++;
                bfs(i);     
            }
        }
        cout << res;
        return 0;
    }

  • 相关阅读:
    GeoServer 2.2 正式版发布,GIS 服务器
    Spring Shell 1.0.0.RC1 发布
    微软发布支持Windows Desktop和F#的Visual Studio Express版本
    XINS 3.0 正式版发布,远程 API 调用规范
    YUI 3.7.2 补丁版发布
    HTML5 Boilerplate 4:改进了Apache配置和图片替换技术,并采用MIT许可证
    解决Windows Phone平台上不能枚举工程自带资源的问题
    截短 UTF8 字符串
    Spring Data Neo4j 2.1.0 RC4 发布
    GTK+ 3.5.18 发布,GUI 开发工具包
  • 原文地址:https://www.cnblogs.com/Knight02/p/15799054.html
Copyright © 2020-2023  润新知