题解 P2097 【资料分发1】

话说一道普及减并查集裸题被我用bfs连通块淦了52行我是不是脑子坏了
但是我仍然来发题解了
话不多说,我们进入正题

本题主要测试选手的图论

【part 1】题意简述

给你能连的无向边,让你求连通块个数

【part 2】算法&思路分析

十年OI一场空,不开longlong见AC。(bushi

请注意双向建边边数×2

由于数据范围过于恶心,所以本题应使用

链式前向星+bfs。

这其实就是本题重点了。

【part 3】代码分析

#include <iostream>
#include <cstdio>
#include <queue>

using namespace std;

struct EDGE {
    int v , nxt ;
} edge[2000005] ;
int n , m , head[100005] , cnt , ans ;
bool vis[100005] ;

void add (int u , int v ) {
    edge[++cnt].v = v ;
    edge[cnt].nxt = head[u] ;
    head[u] = cnt ;
}//建边

void bfs(int s) {
    vis[s] = 1 ;
    queue < int > q ;
    q.push(s) ;
    while(!q.empty()) {
        int u =  q.front() ;
        q.pop() ;
        vis[u] = 1 ;
        for ( int i = head[u] ; i ; i = edge[i].nxt) {
            if(!vis[edge[i].v]) {
                q.push(edge[i].v) ;
            }
        }
    }
}//bfs将连通的全部遍历

int main()
{
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
  cin >> n >> m ;
  for ( int i = 1 ; i <= m ; i ++ ) {
    int u , v ;
    cin >> u >> v ;
    add(u,v) ;
    add(v,u) ;
    }
    for ( int i = 1 ; i <= n ; i ++ ) {
        if(!vis[i])
        bfs(i) , ans ++ ;//没遍历的连通块++并遍历
    }
    cout << ans ;//输出连通块个数
    return 0;
        完结撒花
}
posted @ 2020-11-11 20:47  泠詟  阅读(122)  评论(0)    收藏  举报