代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int max(int x,int y){return x>y?x:y;}
const int N=5e5+5;
inline int read();
int n,m,q,u,v,w;
int ru[N],rv[N],rw[N];
struct sa{
int nxt;
int to;
int w;
}e[N];
int h[N],cnt;
void add(int u,int v,int w){
e[++cnt]=(sa){h[u],v,w};
h[u]=cnt;
return;
}
int fa[N],rnk[N];
struct Edge{
int u;
int v;
int w;
}E[N];
inline bool cmpEdge(Edge a,Edge b){
return a.w<b.w;
}
int len[N],tmp[N];
inline bool cmptmp(int a,int b){
return rw[a]<rw[b];
}
struct node{
int x;
int y;
int fx;
int fy;
int rk;
};
vector<node>lst;
inline int find(int x){
if(x==fa[x])return x;
return find(fa[x]);
}
inline void merge(int fx,int fy){
int x=find(fx),y=find(fy);
if(x==y)return;
if(rnk[x]>rnk[y])swap(x,y);
lst.push_back((node){fx,fy,x,y,rnk[fy]});
fa[x]=y;
rnk[y]=max(rnk[y],rnk[x]+1);
return;
}
struct query{
int from;
int siz;
vector<int>v;
}Q[N];
int sum;
inline void del(){
int x=lst.back().x,y=lst.back().y,fx=lst.back().fx,fy=lst.back().fy,rk=lst.back().rk;
lst.pop_back();
fa[fx]=fx;
rnk[fy]=rk;
return;
}
inline bool cmpquery(query a,query b){
if(rw[a.v[0]]!=rw[b.v[0]])
return rw[a.v[0]]<rw[b.v[0]];
return a.from<b.from;
}
int now=1;
bool ok[N];
int flag;
signed main(){
n=read(),m=read();
for(register int i=1;i<=m;++i){
u=read(),v=read(),w=read();
ru[i]=u,rv[i]=v,rw[i]=w;
E[i]=(Edge){u,v,w};
add(u,v,w);
}
sort(E+1,E+m+1,cmpEdge);
for(register int i=1;i<=n;++i){
fa[i]=i;
rnk[i]=1;
}
q=read();
for(register int i=1;i<=q;++i){
len[i]=read(),ok[i]=1;
for(register int j=1;j<=len[i];++j)
tmp[j]=read();
sort(tmp+1,tmp+len[i]+1,cmptmp);
for(register int j=1;j<=len[i];++j){
if(j==1||rw[tmp[j]]!=rw[tmp[j-1]]){
Q[++sum].from=i;
}
Q[sum].v.push_back(tmp[j]);
Q[sum].siz++;
}
}
sort(Q+1,Q+sum+1,cmpquery);
for(register int i=1;i<=sum;++i){
while(now<=m&&E[now].w<rw[Q[i].v[0]])merge(E[now].u,E[now].v),now++;
flag=1;
for(register int j=0;j<Q[i].siz;++j){
int id=Q[i].v[j];
u=ru[id],v=rv[id];
if(find(u)==find(v))
flag=0;
else
merge(u,v);
}
for(register int j=Q[i].siz-1;j>=0;--j){
int id=Q[i].v[j];
u=ru[id],v=rv[id];
if(lst.size()&&lst.back().x==u&&lst.back().y==v)
del();
}
ok[Q[i].from]&=flag;
}
for(register int i=1;i<=q;++i){
if(ok[i])
puts("YES");
else
puts("NO");
}
return 0;
}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
悬赏3个关注