洛谷传送门


看着这道题给人感觉就是tarjan求SCC,然而还得判断是否能控制全部间谍,这就得先从可以贿赂的点dfs一遍。

如果没有全部被标记了,就输出NO,再从没被标记的点里找最小的标号。

如果全被标记,就输出YES,再从入度为0的缩点里找最小的价格,加到ans中,最后输出ans。

——代码

  1. #include <cstdio>
  2. #include <stack>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. int n, p, r1, cnt, idx, ans = , minn;
  8. int a[], next[], to[], head[], low[], dfn[], belong[], r[];
  9. bool ins[], vis[], mey[];
  10. stack <int> s;
  11.  
  12. inline void add(int x, int y)
  13. {
  14. to[cnt] = y;
  15. next[cnt] = head[x];
  16. head[x] = cnt++;
  17. }
  18.  
  19. void dfs(int u)
  20. {
  21. int i, v;
  22. vis[u] = ;
  23. mey[u] = ;
  24. for(i = head[u]; i != -; i = next[i])
  25. {
  26. v = to[i];
  27. if(!vis[v]) dfs(v);
  28. }
  29. }
  30.  
  31. void tarjan(int u)
  32. {
  33. low[u] = dfn[u] = ++idx;
  34. s.push(u);
  35. ins[u] = ;
  36. int i, v;
  37. for(i = head[u]; i != -; i = next[i])
  38. {
  39. v = to[i];
  40. if(!dfn[v])
  41. {
  42. tarjan(v);
  43. low[u] = min(low[u], low[v]);
  44. }
  45. else if(ins[v]) low[u] = min(low[u], dfn[v]);
  46. }
  47. if(low[u] == dfn[u])
  48. {
  49. cnt++;
  50. do
  51. {
  52. v = s.top();
  53. s.pop();
  54. ins[v] = ;
  55. belong[v] = cnt;
  56. }while(u != v);
  57. }
  58. }
  59.  
  60. int main()
  61. {
  62. int i, j, k, x, y, u, v;
  63. scanf("%d %d", &n, &p);
  64. for(i = ; i <= p; i++)
  65. {
  66. scanf("%d", &x);
  67. scanf("%d", &a[x]);
  68. }
  69. memset(head, -, sizeof(head));
  70. scanf("%d", &r1);
  71. for(i = ; i <= r1; i++)
  72. {
  73. scanf("%d %d", &x, &y);
  74. add(x, y);
  75. }
  76. for(i = ; i <= n; i++)
  77. if(!vis[i] && a[i])
  78. dfs(i);
  79. for(i = ; i <= n; i++)
  80. if(!mey[i])
  81. ans = min(ans, i);
  82. if(ans != )
  83. {
  84. printf("NO\n%d", ans);
  85. return ;
  86. }
  87. cnt = ;
  88. for(i = ; i <= n; i++)
  89. if(!dfn[i])
  90. tarjan(i);
  91. for(u = ; u <= n; u++)
  92. for(i = head[u]; i != -; i = next[i])
  93. {
  94. v = to[i];
  95. if(belong[u] != belong[v]) r[belong[v]]++;
  96. }
  97. ans = ;
  98. for(i = ; i <= cnt; i++)
  99. if(r[i] == )
  100. {
  101. minn = ;
  102. for(j = ; j <= n; j++)
  103. if(belong[j] == i && a[j])
  104. minn = min(minn, a[j]);
  105. ans += minn;
  106. }
  107. printf("YES\n%d", ans);
  108. return ;
  109. }

间谍网络(tarjan缩点)的更多相关文章

  1. tyvj 1153 间谍网络 tarjan有向图强连通

    P1153 - 间谍网络 From ForeverBell    Normal (OI)总时限:13s    内存限制:128MB    代码长度限制:64KB 描述 Description 由于外国 ...

  2. 洛谷 1262 间谍网络 Tarjan 图论

    洛谷 1262 图论 tarjan 并不感觉把这道题目放在图的遍历中很合适,虽然思路比较简单但是代码还是有点多的,, 将可收买的间谍的cost值设为它的价格,不可购买的设为inf,按照控制关系连图,T ...

  3. 间谍网络——tarjan求SCC

    洛谷传送门 看着这道题给人感觉就是tarjan求SCC,然而还得判断是否能控制全部间谍,这就得先从可以贿赂的点dfs一遍. 如果没有全部被标记了,就输出NO,再从没被标记的点里找最小的标号. 如果全被 ...

  4. P1262 间谍网络 (tarjan缩点 水过去)

    题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...

  5. Tarjan缩点【p1262】间谍网络

    Description 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中 ...

  6. 缩点【洛谷P1262】 间谍网络

    [洛谷P1262] 间谍网络 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他 ...

  7. 洛谷 P1262 间谍网络 —— 缩点

    题目:https://www.luogu.org/problemnew/show/P1262 首先,一个强连通分量里有一个点被控制则所有点都被控制,所以先 tarjan 缩点,记一下每个连通块中能被收 ...

  8. Luogu P2002 消息扩散&&P1262 间谍网络

    怕自己太久没写Tarjan了就会把这种神仙算法忘掉. 其实这种类型的图论题的套路还是比较简单且显然的. P2002 消息扩散 很显然的题目,因为在一个环(其实就是强连通分量)中的城市都只需要让其中一个 ...

  9. 初涉tarjan缩点

    tarjan缩点:口胡过好多题,不过从来没写过…… 什么是缩点 tarjan和Kosaraju.Gabow算法一样,是为了求有向图中的强连通分量.因为有向图中大多数情况下会有环存在,而有环是一个不甚好 ...

  10. TYVJ P1153 间谍网络

    P1153 间谍网络 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 由于外国间谍的大量渗入,国家安全正处于高度危机之中.如果A间谍手中掌握着关于B间谍的犯罪 ...

随机推荐

  1. HDU 1221 Rectangle and Circle 考虑很多情况,good题

    http://acm.hdu.edu.cn/showproblem.php?pid=1221 114 92 31 95 13 96 3 这题只需要判断圆和矩形是否相交,然后在里面是不算相交的. 那么就 ...

  2. P1851 好朋友

    题目背景 小可可和所有其他同学的手腕上都戴有一个射频识别序列号码牌,这样老师就可以方便的计算出他们的人数.很多同学都有一个“好朋友” .如果 A 的序列号的约数之和恰好等于B 的序列号,那么 A的好朋 ...

  3. [ HEOI 2016 ] 树

    \(\\\) Description 给出一颗树,开始只有 \(1\) 号节点有标记. \(\ C\ x\) 对 \(x\) 号节点打标记 \(\ Q\ x\) 查询 \(x\) 号节点深度最深的有标 ...

  4. Dom 获取、Dom动态创建节点

    一.Dom获取 1.全称:Document     Object     Model 文档对象模型 2.我们常用的节点类型 元素(标签)节点.文本节点.属性节点(也就是标签里的属性). 3.docum ...

  5. elasticsearch 2.4.0安装说明

    首先从官网下载安装包,是个压缩文件,然后解压 在es目录下找到es的配置文件 修改集群(cluster)名称 PS:一般情况下一台机只部署一个es程序,也就是一个集群,默认集群名是ewater_mai ...

  6. java8的lambda表达式,将List<DTO> 转为 List<DO>

    将List<PhoneDTO>转为List<PhoneDO>,通过java8的lambda表达式来操作,比传统的for循环精简很多: /** * List<PhoneDT ...

  7. Linux常用终端快捷键

    UNIX程序员对键盘以及快捷键的设置都遵循一个标准:"手移动最少的距离,作更多的操作." 所有的类UNIX的终端上都有一些快捷键Ctrl+n = 下,Ctrl+b = 左,Ctrl ...

  8. DMA简介

    直接存储器访问 直接存储器访问(Direct Memory Access,DMA)是计算机科学中的一种内存访问技术.它可以让外设可以独立地直接读写系统存储器,而不需绕道中央处理器(CPU),DMA是一 ...

  9. Javaweb学习笔记10—文件上传与下载

    今天来讲javaweb的第10阶段学习.文件的上传与下载,今天主要说的是这个功能的实现,不用说了,听名字就是外行人也知道肯定很重要啦. 老规矩,首先先用一张思维导图来展现今天的博客内容.       ...

  10. Java遍历HashMap并修改(remove)

    遍历HashMap的方法有多种,比如通过获取map的keySet, entrySet, iterator之后,都可以实现遍历,然而如果在遍历过程中对map进行读取之外的操作则需要注意使用的遍历方式和操 ...