WA on #3
用的是哈希来做的,虽然有可能WA,但也不至于交了十多发还WA吧,所以怀疑哪里写假了,求大佬帮忙调。
#include<bits/stdc++.h>
using namespace std;
int k,tree[400005],vis[100005],n,m,tot,Next[400005],to[400005],First[100005],dep[100005],f[100005][21];
unsigned long long d[100005],tre[400005];
struct edge{
int st,en;
}ee[400005];
inline long long read(){
long long res=0,f=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)){
res=(res<<3)+(res<<1)+c-'0';
c=getchar();
}
return res*f;
}
void add(int x,int y){
Next[++tot]=First[x];
First[x]=tot;
to[tot]=y;
}
void dfs(int u,int fa){
vis[u]=1;
f[u][0]=fa;
dep[u]=dep[fa]+1;
for(int e=First[u];e;e=Next[e]){
int v=to[e];
if(vis[v]) continue;
tree[e]=1;
tree[e^1]=1;
dfs(v,u);
}
return;
}
int dfs2(int u,int fa){
for(int e=First[u];e;e=Next[e]){
int v=to[e];
if(v==fa || !tree[e]) continue;
d[u]^=dfs2(v,u);
}
return d[u];
}
int getlc(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int i=20;i>=0;i--)if(dep[f[u][i]]>=dep[v]) u=f[u][i];
if(u==v) return u;
for(int i=20;i>=0;i--)if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
return f[u][0];
}
int n1[50],n2[50],n1tot=0,n2tot=0,vv[50];
int main(){
srand(time(0));
n=read(),m=read();
tot++;
for(int i=1;i<=m;i++){
ee[i].st=read(),ee[i].en=read();
add(ee[i].st,ee[i].en),add(ee[i].en,ee[i].st);
}
dfs(1,0);
for(int i=1;i<=20;i++)for(int j=1;j<=n;j++)f[j][i]=f[f[j][i-1]][i-1];
for(int i=1;i<=m;i++){
if(!tree[i*2]){
tre[i]=1ll*rand()*rand();
int u=ee[i].st,v=ee[i].en;
if(dep[u]>dep[v]) swap(u,v);
d[u]^=tre[i];
d[v]^=tre[i];
}
}
dfs2(1,0);
k=read();
for(int i=1;i<=m;i++) if(dep[ee[i].st]>dep[ee[i].en]) swap(ee[i].st,ee[i].en);
for(int i=1;i<=k;i++){
int c=read();
n1tot=0,n2tot=0;
for(int j=1;j<=c;j++){
int x=read();
if(tree[x*2]) n1[++n1tot]=x,vv[n1tot]=d[ee[x].en];
else n2[++n2tot]=x;
}
bool flag=0;
for(int j=1;j<=n2tot;j++){
int t=ee[n2[j]].en,s=ee[n2[j]].st;
for(int kk=1;kk<=n1tot;kk++){
int u=ee[n1[kk]].st,v=ee[n1[kk]].en;
if(getlc(v,t)==v && getlc(u,s)==s){
vv[kk]^=tre[n2[j]];
}
}
}
sort(vv+1,vv+n1tot+1);
for(int j=1;j<=n1tot;j++){
if(!vv[j] || vv[j]==vv[j-1]){
flag=1;
break;
}
}
if(flag){
printf("Disconnected\n");
}else{
printf("Connected\n");
}
}
return 0;
}