编程刷题-资料分发1 图论/DFS
P2097 资料分发 1
题目描述
有一些电脑,一部分电脑有双向数据线连接。
如果一个电脑得到数据,它可以传送到的电脑都可以得到数据。
现在,你有这个数据,问你至少将其输入几台电脑,才能使所有电脑得到数据。
输入格式
第一行两个整数 n,mn,mn,m。nnn 是点数,mmm 是边数。
接下来 mmm 行,每行 222 个整数 p,qp,qp,q,表示 ppp 到 qqq 有一条双向数据线。
输出格式
一个整数,表示至少输入的电脑数量。
输入输出样例 #1
输入 #1
4 5
1 2
1 3
2 3
2 1
3 4
输出 #1
1
说明/提示
对于 30%30\%30% 的数据,n≤100n \le 100n≤100,m≤1000m \le 1000m≤1000。
对于 60%60\%60% 的数据,n≤2000n \le 2000n≤2000。
对于 100%100\%100% 的数据,0≤n≤1050 \le n \le 10^50≤n≤105,0≤m≤2×1050 \le m \le 2 \times 10^50≤m≤2×105,1≤p,q≤n1 \le p,q \le n1≤p,q≤n。
数据可能存在重边自环。
dfs解法
#include <bits/stdc++.h>
#include <vector>
using namespace std;
vector <int> p[100001];
int ans;
int n,m,a,b;
int vis[100001];void dfs(int x){for(int i=0;i<p[x].size();i++){if(vis[p[x][i]]==0){vis[p[x][i]]=1;dfs(p[x][i]);}}
}int main()
{cin>>n>>m;for(int i=0;i<m;i++){cin>>a>>b;p[a].push_back(b);p[b].push_back(a);}for(int i=1;i<=n;i++){if(vis[i]==0){ans++;vis[i]=1;dfs(i);}}cout<<ans;return 0;
}