|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
O2优化 , 常数优化都弄了,还是过不了
哪位dalao帮忙优化一下效率啊
- /* https://www.luogu.com.cn/problem/P1536 -- 村村通 */
- /* */
- #include <bits/stdc++.h>
- using namespace std;
- map <int, int> g;
- int n, m, a, b, c, d;
- int find(int a){
- if (g[a] == a){
- return a;
- }
- else{
- return find(g[a]);
- }
- }
- int main(){
- freopen("Input.in", "r", stdin);
- while (true){
- int ans = 0;
- scanf("%d", &a);
- if (a == 0) break;
- for (int i = 0; i < a; i++) g[i + 1] = i + 1;
- scanf("%d", &b);
- for (int i = 0; i < b; i++){
- scanf("%d%d", &c, &d);
- g[find(c)] = find(d);
- }
- for (int i = 0; i < a; i++){
- if (find(i + 1) == i + 1){
- ans++;
- }
- }
- printf("%d\n", ans - 1);
- }
- return 0;
- }
复制代码
这段代码中使用了递归的方式进行 find 操作,可能会导致栈空间过度消耗。建议使用循环代替递归。
另外,map 会增加常数开销,建议考虑使用数组代替 map 存储并查集。
下面是优化后的代码示例,希望对您有所帮助:
- #include <bits/stdc++.h>
- using namespace std;
- const int MAXN = 100005;
- int fa[MAXN];
- int find(int x) {
- if (fa[x] == x) return x;
- return fa[x] = find(fa[x]);
- }
- int main() {
- int n, m, a, b, c, d;
- while (true) {
- scanf("%d", &n);
- if (n == 0) break;
- for (int i = 1; i <= n; i++) fa[i] = i;
- scanf("%d", &m);
- for (int i = 0; i < m; i++) {
- scanf("%d%d", &a, &b);
- fa[find(a)] = find(b);
- }
- int ans = 0;
- for (int i = 1; i <= n; i++) {
- if (fa[i] == i) ans++;
- }
- printf("%d\n", ans - 1);
- }
- return 0;
- }
复制代码
|
|