zoukankan      html  css  js  c++  java
  • [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;
    }

  • 相关阅读:
    4. Dictionary HashTable
    5.1. ISet HashSet
    5.2.ISet SortedSet
    6.1. String
    6.2. Encoding
    2.1. List
    1. 基础类型
    0.源代码代码分布情况
    0.2.比较接口Default
    Android获取应用启动时间
  • 原文地址:https://www.cnblogs.com/Knight02/p/15799054.html
Copyright © 2011-2022 走看看