菜鸡傻傻分不清dfs和bfs
查看原帖
菜鸡傻傻分不清dfs和bfs
306962
MVP_Harry楼主2020/9/25 12:43

RT,这题我原本用的是dfs,结果死活最后一个点TLE,还有一个点WA但这并不重要。

然后借鉴了一下一个题解的BFS写法,复杂度O(n+m)O(n + m)。但我还是没搞懂这题难道DFS不能代替BFS吗?还是我人傻常熟大?

第一份AC代码(bfs)

namespace MySolution2 {
	const int maxn = 1e5 + 5;
	int N, M, vis[maxn], h[maxn];  
	vector<int> G[maxn]; 
	vector<int> s, res; 

	int bfs(int x) {
		int tot = 0;
		queue<int> q;
		q.push(x);
		while (!q.empty()) {
			int u = q.front(); q.pop(); tot++, vis[u] = 1;
			for (int i = 0; i < sz(G[u]); i++) h[G[u][i]] = 1;
			vector<int> tmp = s; s.clear(); 
			for (int i = 0; i < sz(tmp); i++) {
				if (h[tmp[i]]) s.pb(tmp[i]);
				else q.push(tmp[i]); 
			}
			for (int i = 0; i < sz(G[u]); i++) h[G[u][i]] = 0;
		}
		return tot; 
	}

	void solve() {
		cin >> N >> M;
		for (int i = 1; i <= M; i++) {
			int u, v;
			cin >> u >> v;
			G[u].pb(v), G[v].pb(u); 
		}
		for (int i = 1; i <= N; i++) s.pb(i);
		for (int i = 1; i <= N; i++) {
			if (!vis[i]) res.pb(bfs(i)); 
		}
		sort(res.begin(), res.end()); 
		cout << sz(res) << endl; 
		for (int i = 0; i < sz(res); i++) 
			cout << res[i] - 1 << " ";
		cout << endl; 
	}
}

第二份代码(dfs):

namespace MySolution {
	const int maxn = 1e5 + 5;
	int N, M, idx[maxn], ans[maxn], vis[maxn]; 
	vector<int> G[maxn]; 

	void dfs(int u, int k) {
		idx[u] = k;
		ans[k]++; 
		memset(vis, 0, sizeof(vis)); 
		for (int i = 0; i < sz(G[u]); i++) {
			int v = G[u][i];
			vis[v] = 1;
		}
		for (int i = 1; i <= N; i++) {
			if (!vis[i] && !idx[i]) dfs(i, k); 
		}
	}

	void solve() {
		int cnt = 0; 
		cin >> N >> M;
		for (int i = 1; i <= M; i++) {
			int u, v;
			cin >> u >> v;
			G[u].pb(v), G[v].pb(u); 
		}
		for (int i = 1; i <= N; i++) {
			if (!idx[i]) dfs(i, ++cnt); 
		}
		cout << cnt << endl; 
		sort(ans + 1, ans + cnt + 1); 
		for (int i = 1; i <= cnt; i++) 
			cout << ans[i] << " ";
		cout << endl; 
	}
}

求助大佬指点一下复杂度为何不同?谢谢啦!

2020/9/25 12:43
加载中...