\(\mathcal{Description}\)

  Link.

  给定 \(n\) 个点 \(m\) 条边的无向图,判断是否有给每条边定向的方案,使得 \(q\) 组有序点对 \((s,t)\) 都有 \(s\) 可达 \(t\)。

  \(n,m,q\le2\times10^5\)。

\(\mathcal{Solution}\)

  首先,对于原图中的边双,显然是可以让它们互相可达的,考虑把边双缩点。

  此后,图变成了一片森林。单独考虑一棵树,从 \(s\) 到 \(t\) 的有向路径相当于规定了某些点连向父亲的边的方向。所以树上差分,在根上记录点对进入 / 走出子树的次数。若某个棵子树既有进入又有走出就肯定不合法啦。

\(\mathcal{Code}\)

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <assert.h>
  4. #define adj( g, u, v ) \
  5. for ( int i = g.head[u], v; v = g.to[i], i; i = g.nxt[i] )
  6. #define NO() ( puts ( "NO" ), exit ( 0 ) )
  7. const int MAXN = 2e5;
  8. int n, m, q;
  9. int dfc, dfn[MAXN + 5], low[MAXN + 5];
  10. int cnt, bel[MAXN + 5], part, color[MAXN + 5];
  11. int dep[MAXN + 5], fa[MAXN + 5][20], in[MAXN + 5], out[MAXN + 5];
  12. bool cut[MAXN + 5], vis[MAXN + 5], chk[MAXN + 5];
  13. struct Graph {
  14. int ecnt, head[MAXN + 5], to[MAXN * 2 + 5], nxt[MAXN * 2 + 5];
  15. Graph (): ecnt ( 1 ) {}
  16. inline void link ( const int s, const int t ) {
  17. to[++ ecnt] = t, nxt[ecnt] = head[s];
  18. head[s] = ecnt;
  19. }
  20. } G, T;
  21. inline void chkmin ( int& a, const int b ) { if ( b < a ) a = b; }
  22. inline int rint () {
  23. int x = 0; char s = getchar ();
  24. for ( ; s < '0' || '9' < s; s = getchar () );
  25. for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
  26. return x;
  27. }
  28. inline void Tarjan ( const int u, const int id ) {
  29. dfn[u] = low[u] = ++ dfc;
  30. adj ( G, u, v ) {
  31. if ( ! dfn[v] ) {
  32. Tarjan ( v, i ), chkmin ( low[u], low[v] );
  33. if ( low[v] > dfn[u] ) cut[i >> 1] = true;
  34. } else if ( i ^ id ^ 1 ) chkmin ( low[u], dfn[v] );
  35. }
  36. }
  37. inline void mark ( const int u, const int col ) {
  38. bel[u] = col, vis[u] = true;
  39. adj ( G, u, v ) {
  40. if ( ! cut[i >> 1] && ! vis[v] ) {
  41. mark ( v, col );
  42. }
  43. }
  44. }
  45. inline void init ( const int u, const int f, const int c ) {
  46. color[u] = c, dep[u] = dep[fa[u][0] = f] + 1;
  47. for ( int i = 1; fa[u][i - 1]; ++ i ) fa[u][i] = fa[fa[u][i - 1]][i - 1];
  48. adj ( T, u, v ) if ( v ^ f ) init ( v, u, c );
  49. }
  50. inline int calcLCA ( int u, int v ) {
  51. assert ( color[u] == color[v] );
  52. if ( dep[u] < dep[v] ) u ^= v ^= u ^= v;
  53. for ( int i = 17; ~ i; -- i ) if ( dep[fa[u][i]] >= dep[v] ) u = fa[u][i];
  54. if ( u == v ) return u;
  55. for ( int i = 17; ~ i; -- i ) if ( fa[u][i] ^ fa[v][i] ) u = fa[u][i], v = fa[v][i];
  56. return fa[u][0];
  57. }
  58. inline void check ( const int u, const int f ) {
  59. chk[u] = true;
  60. adj ( T, u, v ) if ( v ^ f ) {
  61. check ( v, u );
  62. if ( in[v] && out[v] ) NO ();
  63. in[u] += in[v], out[u] += out[v];
  64. }
  65. }
  66. int main () {
  67. n = rint (), m = rint (), q = rint ();
  68. for ( int i = 1, u, v; i <= m; ++ i ) {
  69. u = rint (), v = rint ();
  70. G.link ( u, v ), G.link ( v, u );
  71. }
  72. for ( int i = 1; i <= n; ++ i ) if ( ! dfn[i] ) Tarjan ( i, -1 );
  73. for ( int i = 1; i <= n; ++ i ) if ( ! vis[i] ) mark ( i, ++ cnt );
  74. for ( int u = 1; u <= n; ++ u ) {
  75. adj ( G, u, v ) if ( cut[i >> 1] ) {
  76. T.link ( bel[u], bel[v] );
  77. }
  78. }
  79. for ( int i = 1; i <= cnt; ++ i ) if ( ! color[i] ) init ( i, 0, ++ part );
  80. for ( int i = 1, s, t; i <= q; ++ i ) {
  81. s = bel[rint ()], t = bel[rint ()];
  82. if ( s == t ) continue;
  83. if ( color[s] ^ color[t] ) NO ();
  84. int w = calcLCA ( s, t );
  85. ++ out[s], -- out[w], ++ in[t], -- in[w];
  86. }
  87. for ( int i = 1; i <= n; ++ i ) if ( ! chk[i] ) check ( i, 0 );
  88. puts ( "YES" );
  89. return 0;
  90. }

Solution -「CF 555E」Case of Computer Network的更多相关文章

  1. 「CF555E」 Case of Computer Network

    「CF555E」 Case of Computer Network 传送门 又是给边定向的题目(马上想到欧拉回路) 然而这个题没有对度数的限制,你想歪了. 然后又开始想一个类似于匈牙利的算法:我先跑, ...

  2. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  3. Solution -「CF 917D」Stranger Trees

    \(\mathcal{Description}\)   Link.   给定一棵包含 \(n\) 个点的有标号树,求与这棵树重合恰好 \(0,1,\cdots,n-1\) 条边的树的个数,对 \(10 ...

  4. Solution -「CF 908G」New Year and Original Order

    \(\mathcal{Description}\)   Link.   对于 \(x\in\mathbb N^*\),令 \(s(x)\) 表示将 \(x\) 十进制下的各位数码排序后得到的十进制数的 ...

  5. Solution -「CF 1622F」Quadratic Set

    \(\mathscr{Description}\)   Link.   求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...

  6. Solution -「CF 923F」Public Service

    \(\mathscr{Description}\)   Link.   给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...

  7. Solution -「CF 923E」Perpetual Subtraction

    \(\mathcal{Description}\)   Link.   有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...

  8. Solution -「CF 1586F」Defender of Childhood Dreams

    \(\mathcal{Description}\)   Link.   定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...

  9. Solution -「CF 1237E」Balanced Binary Search Trees

    \(\mathcal{Description}\)   Link.   定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...

随机推荐

  1. 阿里云服务器 配置 tomcat 发布spring boot项目 的具体操作 【使用公网ip】

    1.前言 spring boot 转成war包 后用tomcat发布的具体操作在我另一篇随笔有详细记载,不论是window系统还是Linux系统,tomcat的发布配置都是一样的,所以这里不具体讲这个 ...

  2. [login] 调用失败 Error: errCode: -404011 cloud function execution error | errMsg: cloud.callFunction:fail requestID , cloud function service error code -501000, error message Environment not found;

    按照微信开放文档,创建完云开发项目,运行,点击获取openid,报如下错: [login] 调用失败 Error: errCode: -404011 cloud function execution ...

  3. 【Java】多态性

    文章目录 多态性 向下转型 多态性 可以理解为一个事物的多种形态. 对象的多态性:父类的引用指向子类的对象.只适用于方法,不适用于属性(编译和运行都看左边) 总结:对于对象的多态性,编译,看左边:运行 ...

  4. 拉普拉斯平滑(Laplacian smoothing)

    概念 零概率问题:在计算事件的概率时,如果某个事件在观察样本库(训练集)中没有出现过,会导致该事件的概率结果是  $0$ .这是不合理的,不能因为一个事件没有观察到,就被认为该事件一定不可能发生(即该 ...

  5. P5024 [NOIP2018 提高组] 保卫王国

    思路: 首先想到每次询问两个点后就从这两个点开始往上爬,沿路更新 dp 值即可. #include <bits/stdc++.h> #define For(i,a,b) for(int i ...

  6. 【初体验】valgrind分析程序性能

    wget https://fossies.org/linux/misc/valgrind-3.15.0.tar.bz2 tar -jxvf valgrind-3.15.0.tar.bz2 cd val ...

  7. 【小记录】android下opencv的cv::dft()函数,CPU版本与opencl版本的性能相差16倍

            cv::dft  相差15.9倍         cpu版本  单次调用  0.029448 毫秒         opencl版本  单次调用  0.468688  毫秒   差别仅 ...

  8. pytest文档3-测试用例setup和teardown

    用例运行级别 模块级(setup_module/teardown_module)开始于模块始末,全局的 函数级(setup_function/teardown_function)只对函数用例生效(不在 ...

  9. vue 快速入门 系列 —— 侦测数据的变化 - [vue api 原理]

    其他章节请看: vue 快速入门 系列 侦测数据的变化 - [vue api 原理] 前面(侦测数据的变化 - [基本实现])我们已经介绍了新增属性无法被侦测到,以及通过 delete 删除数据也不会 ...

  10. mongo用户认证

    mongo@rayos:/opt/mongodb$ mongo --port 28017 MongoDB shell version v4.0.13 connecting to: mongodb:// ...