题面

解析

首先根据Kruskal算法,

我们可以知道,

在加入权值为\(w\)的边时,

权值小于\(w\)的边都已经加进树里了(除了连成环的).

所以,我们可以保存一下每条边的端点在加入生成树之前的连通块,

把询问的边按边权排序,

对于每组边权相同端的边,

把它恢复到加入这种权值的边的连通情况,

在判断能否形成环就行了.

(可能还有很多一些细节要注意)

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std; inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
} const int N=500001;
struct edge{int fx,fy,x,y,w,id;}e[N<<1];
int n,m,Q;
int fa[N];
vector <int> s; bool cmp(edge a,edge b){return a.w<b.w;}
bool cmp2(edge a,edge b){return a.id<b.id;}
bool cmp3(int a,int b){return e[a].w<e[b].w;} inline int find_fa(int x){return x==fa[x]? x:fa[x]=find_fa(fa[x]);} int main(){
n=read();m=read();
for(int i=1;i<=m;i++) e[i].x=read(),e[i].y=read(),e[i].w=read();
for(int i=1;i<=m;i++) e[i].id=i;
for(int i=1;i<=n;i++) fa[i]=i;
sort(e+1,e+m+1,cmp);e[0].w=-1;
for(int i=1;i<=m;){
int j=i;
do{e[j].fx=find_fa(e[j].x);e[j].fy=find_fa(e[j].y);j++;}while(e[i].w==e[j].w&&j<=m);
while(i<j){
while(find_fa(e[i].x)==find_fa(e[i].y)&&i<j) i++;
if(i<j) fa[find_fa(e[i].x)]=find_fa(e[i].y);
}
}
sort(e+1,e+m+1,cmp2);
Q=read();
for(int i=1;i<=n;i++) fa[i]=i;
while(Q--){
int ok=1,ss=read();
for(int i=1;i<=ss;i++){int x=read();s.push_back(x);}
sort(s.begin(),s.end(),cmp3);
int sz=s.size();
for(int i=0;i<sz&&ok;){
if(e[s[i]].fx==e[s[i]].fy){ok=0;break;}
fa[find_fa(e[s[i]].fx)]=find_fa(e[s[i]].fy);
int j=i+1;
while(j<sz&&e[s[i]].w==e[s[j]].w){
if(find_fa(e[s[j]].fx)==find_fa(e[s[j]].fy)){ok=0;break;}
fa[find_fa(e[s[j]].fx)]=find_fa(e[s[j]].fy);j++;
}
while(i<j) fa[e[s[i]].fx]=e[s[i]].fx,fa[e[s[i]].fy]=e[s[i]].fy,i++;
}
puts(ok? "YES":"NO");s.clear();
}
return 0;
}

最新文章

  1. 求子串-KPM模式匹配-NFA/DFA
  2. oneM2M
  3. 搭建struts2框架
  4. C语言实现通用数据结构的高效设计
  5. Xcode 8 控制台输出大量不用的log的问题解决&amp;&amp;NSLog失效的解决
  6. openstack私有云布署实践【13.2 网络Neutron-compute节点配置(办公网环境)】
  7. 导入excel表格的数据---&gt;到mysql中
  8. linux命令行解刨
  9. 201521123024 《Java程序设计》 第九周学习总结
  10. SendCloud邮件中为什么会显示代发
  11. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL
  12. Ubuntu 下安装 matlab2018a
  13. ztre的使用入门
  14. visual studio 各版本激活码
  15. Codeforces 965E Short Code 启发式合并 (看题解)
  16. Druid连接池(二)
  17. java算法:统计数字-将数字转换成字符串,然后使用字符串String.valueOf()方法进行判断
  18. log4j2配置推荐
  19. [学习笔记]K-D Tree
  20. POJ 2636

热门文章

  1. 正确理解使用Vue里的nextTick方法
  2. Netty源码剖析-业务处理
  3. __formart__
  4. F12的用法
  5. AtCoder Beginner Contest 144 题解
  6. hdu 6140 思维
  7. c#学习笔记-string stringBuilder
  8. Vim 添加vimgdb支持
  9. PCA(主成分分析)方法浅析
  10. js中数组方法及分类