题解 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;
完结撒花
}

浙公网安备 33010602011771号