#includeusing namespace std;const int maxn=1e6+10;int f[maxn];int visf[maxn];int vis[maxn];int as[maxn];vector v[maxn];priority_queue ,greater > q;int getf(int a){ if(f[a]==a) return a; else return f[a]=getf(f[a]);}int main(){ int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); while(q.size()) q.pop(); for(int i=1; i<=n; i++) { f[i]=i; vis[i]=0; visf[i]=0; v[i].clear(); } for(int i=1; i<=m; i++) { int a,b; scanf("%d%d",&a,&b); f[getf(b)]=getf(a); v[a].push_back(b); v[b].push_back(a); } int ans=0; for(int i=1; i<=n; i++) { if(getf(i)==i) ans++; if(visf[getf(i)]==0) { q.push(i); visf[getf(i)]=1; vis[i]=1; } } int len=0; while(!q.empty()) { int t1=q.top(); q.pop(); as[++len]=t1; for(int i=0; i
邻接表也是可以过的,,注意!!存有向图,数组开边的二倍!!初始化时要用memset(a,0,(m+1)*sizeof(int))
#includeusing namespace std;const int maxn=1e6+10;int f[maxn];int visf[maxn];int vis[maxn];int as[maxn];//vector v[maxn];const int maxm=2e6+10;int tot=0,head[maxm],nxt[maxm],ver[maxm];void add(int u,int v){ ver[++tot]=v; nxt[tot]=head[u]; head[u]=tot;}priority_queue ,greater > q;int getf(int a){ if(f[a]==a) return a; else return f[a]=getf(f[a]);}int main(){ int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); memset(ver,0,(m*2+1)*sizeof(int)); memset(nxt,0,(m*2+1)*sizeof(int)); while(q.size()) q.pop(); for(int i=1; i<=n; i++) { f[i]=i; head[i]=0; vis[i]=0; visf[i]=0;// v[i].clear(); } tot=0; for(int i=1; i<=m; i++) { int a,b; scanf("%d%d",&a,&b); f[getf(b)]=getf(a); add(a,b); add(b,a);// v[a].push_back(b);// v[b].push_back(a); } int ans=0; for(int i=1; i<=n; i++) { if(getf(i)==i) ans++; if(visf[getf(i)]==0) { q.push(i); visf[getf(i)]=1; vis[i]=1; } } int len=0; while(!q.empty()) { int t1=q.top(); q.pop(); as[++len]=t1; for(int i=head[t1]; i; i=nxt[i]) { int y=ver[i]; if(vis[y]) continue; q.push(y); vis[y]=1; }// for(int i=0; i