己卯年三月十二 2019-05-06 22:11 采纳率: 0%
浏览 201

Zoj4109 不知道为什么代码一直段错误,请大佬帮看看

Zoj4109链接
题目处理方法为并查集+优先队列
本蒟蒻Segmentation fault代码如下:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <math.h>
#include <map>
#include <set>
#include <stdlib.h>
#include <ctype.h>
#include <stack>
#include <bitset>
#include <iterator>
using namespace std;
#define ull unsigned long long
#define ll long long
#define ls k<<1
#define rs k<<1|1
#define lson l,mid,k<<1
#define rson mid+1,r,k<<1|1
typedef pair<int,int> pii;
int lowbit(int x){return x&(-x);} 
const int maxn=1e6+5;
vector<int> G[maxn];
int vis[maxn],n,m;
int pre[maxn],cnt,mn[maxn];
int findRoot(int x){
    if(x==pre[x]) return x;
    return pre[x]=findRoot(pre[x]);
}
void initial(void){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i) G[i].clear(),pre[i]=i,vis[i]=0,mn[i]=i;
    cnt=n;
    for(int i=0;i<m;++i){
        int u,v;scanf("%d%d",&u,&v);
        G[u].push_back(v);G[v].push_back(u);
        int x=findRoot(u),y=findRoot(v);
        if(x!=y){
            --cnt;
            mn[x]=mn[y]=min(mn[x],mn[y]);
            pre[x]=y;   //问题原因大概是在这里,将本行改为下方注释内容即可AC,但是不理解为什么。请大佬指点! 
        //  if(x>y) pre[x]=y;
        //  else pre[y]=x;
        }
    }
}
int ans[maxn],tp;
void solve(void){
    tp=0;
    priority_queue<int,vector<int>,greater<int> > q;
    for(int i=1;i<=n;++i){
        int x=findRoot(i);
        if(!vis[mn[x]]) q.push(mn[x]),vis[mn[x]]=1;
    }
    while(!q.empty()){
        int u=q.top();q.pop();          
        ans[tp++]=u;
        for(int i=0;i<G[u].size();++i)if(!vis[G[u][i]]){
            vis[G[u][i]]=1;
            q.push(G[u][i]);
        }
    }
    printf("%d\n%d",cnt,ans[0]);
    for(int i=1;i<tp;++i) printf(" %d",ans[i]);
    puts("");
}
int main(void){
    int T;scanf("%d",&T);
    while(T--){
        initial();
        solve();
    }
    return 0;
}
  • 写回答

1条回答 默认 最新

  • UCPRER 2020-10-09 19:15
    关注

    我跟你一样,并查集没有按顺序合并就段错误,改成优先合并到小的节点上就AC了,你解决这个问题了吗?

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条