#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5e5+13;
const ll p=1e9+7;
struct edge{
int u,v,k;
bool operator <(const edge &a)const{
if(u==a.u) return v<a.v;
return u<a.u;
}
}E[N];
int n,m,Tot,top,Fa[N],siz[N],ans[N];
bool state[N],have[N],vis[N];
int Find(int x){return Fa[x]==x?x:Fa[x]=Find(Fa[x]);}
inline void merge(int ki,int u,int v){
int x=Find(u),y=Find(v);
if(x!=y&&(!state[x]||!state[y])) Fa[x]=y,siz[y]+=siz[x],state[y]|=state[x];
else vis[ki]=1;
}
inline ll quick(ll a,int k){
ll s=1;
while(k){
if(k&1) s=s*a%p;
a=a*a%p;
k>>=1;
}
return s;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1,op,u,v;i<=n;++i){
scanf("%d",&op);
if(op==1){
scanf("%d",&u);
state[u]=1,have[u]=1;
ans[++top]=i;
}
else{
scanf("%d%d",&u,&v);have[u]=have[v]=1;
if(u>v) swap(u,v);
E[++Tot]=(edge){u,v,i};
}
}
sort(E+1,E+Tot+1);
for(int i=1;i<=m;++i) Fa[i]=i,siz[i]=1;
for(int i=1;i<=Tot;++i) merge(i,E[i].u,E[i].v);
ll res1=1;
for(int i=1;i<=m;++i)
if(have[i]&&Fa[i]==i){
if(!state[i]) res1=res1*quick(2,siz[i]-1)%p;
else res1=res1*quick(2,siz[i])%p;
}
for(int i=1;i<=Tot;++i)
if(!vis[i]) ans[++top]=E[i].k;
printf("%lld %d\n",res1,top);
sort(ans+1,ans+top+1);
for(int i=1;i<=top;++i) printf("%d ",ans[i]);
return 0;
}
一直WA on test7,求大佬查错……
是不是算法假了?如果是,请问哪个地方假了?
感激不尽!