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;
}