题意:有n个点,m条边,边有c种颜色,q次操作。

每个边都有一种颜色。

然后操作有两种,一种是再加一条边,另一种是查询能否从x达到y。

移动的限制是,连着走两步必须是同一种颜色,如果走奇数步,最后一步可以是任意颜色。

例子:1-2-3-4-5-6。

这个题颜色种类很多,我是用map<int,vector<int>>来存边。

我们首先可以想到 对于点x同种颜色连着的点都是可以相互移动的,所以我们可以用这种方法将它们用并查集合并,我们也可以直接map<int,int>来存边,因为一个vector里的点是等价的。

但是这样有一个问题,走偶数步可以走通的已经被我们合并可以直接查询了,那么最后一步能走到的怎么办呢?

我们可以对每个联通集合存一个set,里面放集合中能一步走到的点。我们之后要合并集合,这个set自然也要合并,本来是想着用可并堆,但是其实用启发式合并也可以了。

以下为代码:

#include<bits/stdc++.h>
using namespace std;
int i,i0,n,m,c,q,pre[100005];
map<int,vector<int>>mp[100005];
set<int>dic[100005];
int fin(int x){return (pre[x]==x)?x:pre[x]=fin(pre[x]);}
void uni(int x,int y)
{if(fin(x)!=fin(y)){if(dic[fin(x)].size()<dic[fin(y)].size())swap(x,y);for(auto i:dic[fin(y)])dic[fin(x)].insert(i),pre[fin(y)]=fin(x);}
}
void add()
{int x,y,col;scanf("%d %d %d",&x,&y,&col);dic[fin(x)].insert(y),dic[fin(y)].insert(x);mp[x][col].push_back(y),uni(y,mp[x][col][0]);mp[y][col].push_back(x),uni(x,mp[y][col][0]);
}
int main()
{scanf("%d %d %d %d",&n,&m,&c,&q);for(i=1;i<=n;i++)pre[i]=i;while(m--)add();while(q--){char op;scanf(" %c",&op);if(op=='?'){int x,y;scanf("%d %d",&x,&y);printf("%s\n",(fin(x)==fin(y)||dic[fin(x)].count(y))?"Yes":"No");}else add();}return 0;
}

转载于:https://www.cnblogs.com/megalovania/p/10896862.html

Codeforces 1166 F. Vicky's Delivery Service 并查集+set相关推荐

  1. codeforces#1166F. Vicky's Delivery (Service并查集+启发式合并)

    题目链接: https://codeforces.com/contest/1166/problem/F 题意: 给出节点数为$n$,边数为$m$的图,保证每个点对都是互连的 定义彩虹路:这条路经过$k ...

  2. Codeforces Global Round 14 F. Phoenix and Earthquake 思维 + 并查集

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点,mmm条边,限制xxx,每个点都有沥青aia_iai​,定义合并两个点即两点之间有边且au+av≥xa_u+a_v\ge xau​+av​≥x ...

  3. CodeForces - 1463E Plan of Lectures(拓扑排序+并查集缩点)

    题目链接:点击查看 题目大意:给出一棵有根树,树边都是有向边,再给出 kkk 个关系 (x,y)( x , y )(x,y),其意义是访问完点 xxx 后需要立即访问点 yyy,问是否存在一种合适的拓 ...

  4. codeforces1303 F. Number of Components(并查集+添_正序、删_逆序)

    F. Number of Components 并查集,每次修改考虑的是这个修改带来的贡献,就是和相邻颜色的对比,如果不考虑先不考虑颜色覆盖,那么添加颜色首先会产生一个新的连通块,然后考虑合并,每合并 ...

  5. 【CodeForces - 1131F 】Asya And Kittens(并查集,思维)

    题干: Asya loves animals very much. Recently, she purchased nn kittens, enumerated them from 11 and nn ...

  6. 【CodeForces - 616C 】The Labyrinth点石成金(并查集,dfs)

    题干: 小O无意间发现了一张藏宝图,它跟随藏宝图的指引来到了一个宫殿,宫殿的地板被分成了n*m块格子,每个格子上放置了金子或者石头 藏宝图告诉小O,它可以选择一块石头变成金子,并且带走与变化后的金子联 ...

  7. Codeforces Contest 1081 problem D Maximum Distance —— 并查集

    Chouti was tired of the tedious homework, so he opened up an old programming problem he created year ...

  8. 暑期集训5:并查集 线段树 练习题F:  HDU - 1166 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题F  --   HDU - 1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...

  9. CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换,清晰易懂)

    CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换)   首先一共有四个操作,第一个和第四个都是线段树的基本操作,直接用线段树实现.      第 ...

最新文章

  1. mysql监控内存cpu使用率_监控 cpu 内存 网卡的使用情况的一个命令 比较实用
  2. lombok使用中出现继承关系的对象时,出现的问题及解决办法
  3. android PendingIntent参数详细解析
  4. 剑指offer(34-40题)详解
  5. MySQL创建数据库与创建用户以及授权
  6. 台式机dp接口_2K至4K显示器性价比线材选购攻略,毕亚兹 DP高清线入手
  7. mysql 修改字符集为utf8mb4
  8. linux压缩文件夹
  9. shell习题第26题:监控mysql服务
  10. 64位计算机安装xp,Windows XP(64位)如何安装语言包
  11. BXP多分区的正确的操作步骤(转)
  12. 关于黑马JavaWeb教程注册登录案例报错
  13. [bzoj 4939][Ynoi 2016]掉进兔子洞
  14. win7计算机无法远程桌面连接,解决win7无法被远程桌面连接教程
  15. win的反义词_单词还死记硬背?反义词法让孩子轻松记单词!
  16. GNSS文件下载网址
  17. db2import详解_DB2中import详解 - yishueitian326的日志 - 网易博客
  18. 新一代SSD接口来了 | M.2接口发福版?
  19. TensorFlow简单实例(二):logistic regression
  20. Android sqlite数据库的使用(增删改查)

热门文章

  1. Keil C系列之编译器介绍(1)
  2. 江湖CMS框架改成百度UEditor富文本编辑器
  3. 13款网站在线性能测试工具
  4. 环境土壤物理模型HYDRUS建模方法与多案例应用
  5. 到期日计算,账龄报表
  6. 【ORM框架】go语言ORM框架 - gorm快速入门
  7. android pdf preview,Preview 真的能解决你的 PDF 预览需求吗?
  8. 计算音频一秒播放多少帧
  9. python npv 计算公式_怎样用python写经济学的npv公式
  10. 可以独立部署的抽奖助手小程序如何开发搭建一览