问题 A: 第一题
题目描述
该题的目的是要你统计图的连通分支数。
输入
每个输入文件包含若干行,每行两个整数i,j,表示节点i和j之间存在一条边。
输出
输出每个图的联通分支数。
样例输入 Copy
1 4 4 3 5 5
样例输出 Copy
2
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxv = 1000010;
int n = 0, ans = 0;
vector<int> edge[maxv]; // 这里使用邻接表, 邻接矩阵会内存超限
bool visit[maxv] = {false};
bool Hash[maxv] = {false};
/*深度优先*/
void DFS(int u, int depth){
visit[u] = true;
for(int i=0; i<edge[u].size(); i++){
int v = edge[u][i];
if(visit[v]==false){
DFS(v, depth+1);
}
}
}
void DFSTravel(){
for(int u=0; u<=n; u++){
if(Hash[u]==true&&visit[u]==false){
DFS(u, 1);
ans++;
}
}
}
/*广度优先*/
void BFS(int u){
queue<int> q;
q.push(u);
visit[u] = true;
while(!q.empty()){
int top = q.front();
q.pop();
for(int i=0; i<edge[top].size(); i++){
int v = edge[top][i];
if(visit[v]==false){
q.push(v);
visit[v] = true;
}
}
}
}
void BFSTravel(){
for(int u=0; u<=n; u++){
if(Hash[u]==true&&visit[u]==false){
BFS(u);
ans++;
}
}
}
int main(){
int a, b;
while(scanf("%d%d", &a, &b)!=EOF){
edge[a].push_back(b);
edge[b].push_back(a);
n = max(n, max(a, b));
Hash[a] = Hash[b] = true;
}
DFSTravel();/*深度*/
BFSTravel();/*广度*/
printf("%d\n", ans);
return 0;
}