AGC038D - Unique Path

Solution

此题较水。
大概就是简单路径唯一意味着连成一棵树,因此先给这些限制的端点放在同一个连通块内,然后如果有多条路径的限制的两端点在同一个连通块内,则无解。

然后考虑如果没有多条路径的限制,则还要连的边数最少为t−1t-1t−1,最多为t(t−1)2\frac{t(t-1)}{2}2t(t−1)​(ttt为连通块个数),直接判断即可。

如果有多条路径,则还要连的边数最少为ttt(一种可行方案是每个限制以以每个连通块的根为端点连成环),最多为t(t−1)2\frac{t(t-1)}{2}2t(t−1)​,且连通块个数至少要有两个,否则没法连成环。

时间复杂度O(nlgn)O(nlgn)O(nlgn)。

Code

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline ll read()
{ll f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
int f[MAXN];
struct Enode{ int u,v,c; } E[MAXN];
int find(int x) { return f[x]==x?f[x]:f[x]=find(f[x]); }
signed main()
{ll n=read(),m=read(),q=read(),es=0,ec=0;for (int i=1;i<=n;i++) f[i]=i;for (int i=1;i<=q;i++){int u=read()+1,v=read()+1,c=read();E[i]=(Enode){u,v,c};if (!c&&find(u)!=find(v)) f[find(u)]=find(v),es++;else if (c) ec++;}for (int i=1;i<=q;i++) if (E[i].c&&find(E[i].u)==find(E[i].v)) { puts("No"); return 0; }ll t=0;for (int i=1;i<=n;i++) if (find(i)==i) t++;if (ec) puts((m-es>=t&&m-es<=t*(t-1)/2&&t>2)?"Yes":"No");else puts((m-es>=t-1&&m-es<=t*(t-1)/2)?"Yes":"No");return 0;
}

AGC038D - Unique Path(建图)相关推荐

  1. AtCoder AGC038D Unique Path (图论)

    题目链接 https://atcoder.jp/contests/agc038/tasks/agc038_d 题解 orz zjr神仙做法 考虑把所有\(C_i=0\)的提示的两点连边,那么连完之后的 ...

  2. 【牛客 - 331D】炫酷路途(二进制枚举 或 建图方式+最短路 或 dfs)

    题干: 小希现在要从寝室赶到机房,路途可以按距离分为N段,第i个和i+1个是直接相连的,只需要一秒钟就可以相互到达. 炫酷的是,从第i个到第i+2pi+2p个也是直接相连的(其中p为任意非负整数),只 ...

  3. SLAM系列——机器人顶刊T-RO!用于关联、建图和高级任务的物体级SLAM框架

    系列文章目录 SLAM系列--第一讲 预备知识[2023.1] SLAM系列--第二讲 初识SLAM[2023.1] SLAM系列--第三讲 三维空间刚体运动[2023.1] SLAM系列--第四讲 ...

  4. 实验三 Gmapping建图

    体验内容 使用gmapping方法利用turtlebot底盘移动信息和激光雷达数据进行建图. 1. 安装一些依赖包 sudo apt-get install ros-melodic-move-base ...

  5. POJ-1122 FDNY to the Rescue!---Dijkstra+反向建图

    题目链接: https://vjudge.net/problem/POJ-1122 题目大意: 给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路 ...

  6. PAT甲级1131 Subway Map (30分):[C++题解]堆优化dijkstra、单源最短路、地铁地图、巧妙地建图套dijkstra模板!!

    文章目录 题目分析 题目链接 题目分析 原题: 来源:acwing 分析: 建图:所有能走到的点之间建立一条边,比如下面一条地铁线路有4站,它们是相通的,两两之间建一条边,边权是经过的站点数. 下面考 ...

  7. CodeForces - 1422D Returning Home(最短路+思维建图)

    题目链接:点击查看 题目大意:给出一个 n * n 的二维平面,现在要从点 ( sx , sy ) 到达点 ( fx , fy ),在平面上有 m 个传送门,共有两次操作: 向上.下.左.右移动一个单 ...

  8. codeforces gym100959 I - Robots(稠密图建图优化)

    I - Robots 显然可以两点之间能连边就连边,但是边数会很多,考虑优化 对于三个点(x0,y0)(x_0,y_0)(x0​,y0​),(x0,y1)(x_0,y_1)(x0​,y1​),(x0, ...

  9. 六.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---4.laserMapping.cpp--后端建图和帧位姿精估计(优化)

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

最新文章

  1. linux 截取后缀名,Shell 截取文件名和后缀
  2. 每日程序C语言3-三个数大小排序
  3. 搭搭机器人科技活动中心怎么样_搭搭乐乐机器人怎么样?感受科技创收力量
  4. 你可能不知道的 docker 命令的奇淫怪巧
  5. 为ie和chrome FF单独设置样式的“条件注释法”、“类内属性前缀法”、“选择器前缀法”、实现方法 案例(推荐)
  6. 关于数据统计时的效率
  7. php 回调通知 连连支付_php app支付宝回调(异步通知)详解
  8. java静态方法和非静态方法的区别_史上最全阿里 Java 面试题总结
  9. Android学习笔记---28_网络通信之通过HTTP协议实现文件上传,组拼http 的post方法,传输内容
  10. 从功能到接口,原来技能可以通用!
  11. [转]HashMap,LinkedHashMap,TreeMap的区别
  12. hadoop 如何连beeline_Hadoop家族新成员Hbase重磅来袭
  13. java文件转base64
  14. eclipse使用git合并_Eclipse的git插件冲突合并方法
  15. 网络安全学习笔记-入侵检测系统IDS
  16. shell 搜索文件夹下所有文件
  17. 宏碁电脑BIOS没有usb启动项怎么办?
  18. 梅科尔工作室-OpenEuler培训第二讲笔记
  19. 倪光南:友友云计算中间件体现后发优势
  20. 普通程序员如何正确学习人工智能方向的知识?

热门文章

  1. 留学申请中,你们怎么老让我做科研啊?
  2. 头上有多少根头发算秃头?
  3. 25岁男生要有多少存款才能让女友满意?
  4. 马云害怕的事还是发生了
  5. linux mysql帮助文档,在 Linux 上安装 MySQL
  6. 自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程
  7. 计算机所有数据的表示方式都是用,计算机数据表示
  8. 数字调制系统工作原理_空间光调制器工作原理是什么 空间光调制器工作原理...
  9. 后端学习 - JDBC
  10. C++ 学习之旅(5)——设置Setup文件目录