传送门

思路:

  ①在 Tarjan 的基础上加一个 belong 记录每个点属于哪个强连通分量。

  ②存图完成后,暴力地遍历全图,查找是否要间谍不愿受贿。

  1. inline void dfs(int u)
  2. {
  3. if(vis[u]) return ;
  4. vis[u]=true,tot++;
  5. for(int i=head[u];i;i=t[i].nex)
  6. dfs(t[i].to);
  7. }//遍历

  遍历完后,看看那个间谍没被搜索过(vis数组记录),就把那个不受贿的间谍抓出来。

  ③如果所有的间谍都愿意受贿,就继续。可以开一个smon数组,记录每个强连通分量中间谍愿意受贿的最小的钱数。结合belong数组(因为一个强连通分量只要让一个间谍受贿,就能拖出这个强连通分量中所有的间谍。),用ans记录所需总的钱数,输出。

AC代码: 

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<string>
  7. #include<algorithm>
  8. #include<queue>
  9. #include<stack>
  10. #include<deque>
  11. using namespace std;
  12. #define maxn 3001
  13. #define maxm 9000000
  14. #define INF 0x3f3f3f3f
  15. int n,m,cnt,tot,dfn[maxn],low[maxn],sta[maxn],belong[maxn],rd[maxn],smon[maxn],mon[maxn];
  16. //belong记录每个点属于哪个强连通分量,rd记录每个点的入度,smon记录间谍网络中每个连通块的最小受贿的钱,mon记录每个间谍的受贿所需的钱
  17. bool vis[maxn];
  18. struct hh
  19. {
  20. int nex,to;
  21. }t[maxm];
  22. int tto=,head[maxm];//链式前向星
  23. inline void add(int nex,int to)
  24. {
  25. t[++tto].nex=head[nex];
  26. t[tto].to=to;
  27. head[nex]=tto;
  28. }//存图部分
  29. inline void dfs(int u)
  30. {
  31. if(vis[u]) return ;
  32. vis[u]=true,tot++;
  33. for(int i=head[u];i;i=t[i].nex)
  34. dfs(t[i].to);
  35. }//遍历初始图
  36. inline int read()
  37. {
  38. char kr=;
  39. char ls;
  40. for(;ls>''||ls<'';kr=ls,ls=getchar());
  41. int xs=;
  42. for(;ls>=''&&ls<='';ls=getchar())
  43. {
  44. xs=xs*+ls-;
  45. }
  46. if(kr=='-') xs=-xs;
  47. return xs;
  48. }//快读
  49. inline void tarjan(int u)//tarjan的模板
  50. {
  51. dfn[u]=low[u]=++tot;
  52. vis[u]=true;
  53. sta[++cnt]=u;
  54. for(int i=head[u];i;i=t[i].nex)
  55. {
  56. int v=t[i].to;
  57. if(!dfn[v])
  58. {
  59. tarjan(v);
  60. low[u]=min(low[u],low[v]);
  61. }
  62. else if(vis[v])
  63. {
  64. low[u]=min(low[u],dfn[v]);
  65. }
  66. }//日常操作
  67. if(dfn[u]==low[u])
  68. {
  69. smon[u]=INF;
  70. do
  71. {
  72. vis[sta[cnt]]=false;
  73. belong[sta[cnt]]=u;
  74. smon[u]=min(smon[u],mon[sta[cnt]]);//取连通块中间谍受贿的最小值,更新smon
  75. cnt--;
  76. }while(sta[cnt+]!=u);
  77. }
  78. }
  79. int main()
  80. {
  81. n=read();m=read();
  82. for(int i=;i<=n;i++)
  83. mon[i]=INF;//不受贿的间谍设为一个极大值
  84. for(int i=;i<=m;i++)
  85. {
  86. int x,y;
  87. x=read();y=read();
  88. mon[x]=y;//读入受贿间谍要的钱
  89. }
  90. m=read();
  91. for(int i=;i<=m;i++)
  92. {
  93. int x,y;
  94. x=read();y=read();
  95. add(x,y);//加边存图
  96. }
  97. for(int i=;i<=n;i++)
  98. if(mon[i]!=INF)
  99. dfs(i);//遍历全图,确定是否有间谍不愿被收买
  100. for(int i=;i<=n;i++)
  101. {
  102. if(!vis[i])//找到那个不愿被收买的间谍
  103. {
  104. printf("NO\n%d",i);
  105. return ;//直接结束程序
  106. }
  107. }
  108. tot=;
  109. for(int i=;i<=n;i++)
  110. vis[i]=;//初始化vis
  111. for(int i=;i<=n;i++)
  112. if(mon[i]!=INF && !dfn[i])
  113. tarjan(i);//tarjan记录强连通分量数,及每个强连通分量的smon
  114. for(int i=;i<=n;i++)
  115. {
  116. for(int j=head[i];j;j=t[j].nex)
  117. {
  118. if(belong[i]!=belong[t[j].to])
  119. rd[belong[t[j].to]]++;//统计每个强连通分量的入度 (找入度为0的点)
  120. }
  121. }
  122. int ans=;
  123. for(int i=;i<=n;i++)
  124. if(belong[i]==i && !rd[i])
  125. ans+=smon[i];//入度为0的点,即为连通块的起点,且smon已经被更新,直接加入答案
  126. printf("YES\n%d",ans);//输出
  127. return ;
  128. }

其实也没有想象中的那么暴力,手写栈+inline后,最慢的一个点都只用了4ms。

P1262 间谍网络的更多相关文章

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

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

  2. 洛谷——P1262 间谍网络

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

  3. 洛谷 P1262 间谍网络==Codevs 4093 EZ的间谍网络

    4093 EZ的间谍网络 时间限制: 10 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B ...

  4. 洛谷P1262 间谍网络[强连通分量 BFS]

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

  5. 洛谷 P1262 间谍网络 Label: Kosarajn强联通

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

  6. 洛谷P1262 间谍网络

    本来只想刷道小题,没想到还有点麻烦 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美 ...

  7. 洛谷P1262间谍网络

    题目 我们首先考虑该题没有环应该怎么做,因为没有环所以是一个DAG,因此直接加上入度为0的罪犯,而有环则可以缩点,之后就成为了DAG,然后用一方法做就好了. \(Code\) #include < ...

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

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

  9. luogu P1262 间谍网络

    嘟嘟嘟 建图还是很明显的. 接着分两种情况: 1.图中不存在环:那么只要收买那些入度为0的点.如果这些点有的不能收买.就不能控制所有间谍. 2.图中存在环,那么对于这些在环中的点,我们只要收买数额最少 ...

随机推荐

  1. SpringMVC之数据绑定

    SpringMVC之数据绑定 #数据绑定:Spring MVC会根据客户端请求参数的不同,将请求信息以一定的方式转换并绑定 到控制器类中的方法参数上. #说明:这里的“以一定的方式”应该指的是什么?过 ...

  2. Pytorch的torch.cat实例

    import torch 通过 help((torch.cat)) 可以查看 cat 的用法 cat(seq,dim,out=None) 其中 seq表示要连接的两个序列,以元组的形式给出,例如:se ...

  3. Prometheus监控学习笔记之Prometheus监控简介

    0x00 Prometheus容器监控解决方案 Prometheus(普罗米修斯)是一个开源系统监控和警报工具,最初是在SoundCloud建立的.它是一个独立的开放源码项目,并且独立于任何公司.不同 ...

  4. HTMLCollection 对象和NodeList 对象

    获取html元素有三种方法,其中通过类名和标签获取的结果为一个HTMLCollection对象. HTMLCollection对象可以理解为一个包含html元素的数组(但不是数组),可以通过索引[ ] ...

  5. bzoj4698 / P2463 [SDOI2008]Sandy的卡片

    P2463 [SDOI2008]Sandy的卡片 直接二分长度暴力匹配....... 跑的还挺快 (正解是后缀数组的样子) #include<iostream> #include<c ...

  6. Apache2.4反向代理设置

    一.配置方向代理 1,放开虚拟主机(反向代理)模块,在httpd.conf中把下三行配置放开: LoadModule proxy_module modules/mod_proxy.so LoadMod ...

  7. 《2015 html5 iweb 峰会观会后感》

    今天是2015  html5 iweb 峰会,大会在早上8:30,就开始了,没想到被坑了,看错一个字,把"国际会议中心",看成了"国家会议中心".大约过了10多 ...

  8. rabbitmq级联之shovel插件和exchange.bind

    有时候,由于各方面原因比如安全原因.系统间隔离,我们需要实现在多个rabbitmq实例或者一个rabbitmq实例的多个vhost间推送消息.在上一版的实现中,公司使用java自行实现了一个类似转发器 ...

  9. Angular routing生成路由和路由的跳转

    Angular routing生成路由和路由的跳转 什么是路由 路由的目的是可以让根组件按照不同的需求动态加载不同的组件. 根据不同地址,加载不同组件,实现单页面应用. Angular 命令创建一个配 ...

  10. metasploit(MSF)对windows的ms17-010漏洞利用

    picture 配置exploit msf > use exploit/windows/smb/ms17_010_eternalblue msf exploit(windows/smb/ms17 ...