4093 EZ的间谍网络

时间限制: 10 s    空间限制: 128000 KB    题目等级 : 黄金 Gold

题目描述

由于外国间谍的大量渗入,国家安全正处于高度的危机之中。如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B。有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报。所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子。因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报。

我们的反间谍机关提供了一份资料,色括所有已知的受贿的间谍,以及他们愿意收受的具体数额。同时我们还知道哪些间谍手中具体掌握了哪些间谍的资料。假设总共有n个间谍(n不超过3000),每个间谍分别用1到3000的整数来标识。

请根据这份资料,判断我们是否有可能控制全部的间谍,如果可以,求出我们所需要支付的最少资金。否则,输出不能被控制的一个间谍。

输入输出格式

输入格式:

第一行只有一个整数n。

第二行是整数p。表示愿意被收买的人数,1≤p≤n。

接下来的p行,每行有两个整数,第一个数是一个愿意被收买的间谍的编号,第二个数表示他将会被收买的数额。这个数额不超过20000。

紧跟着一行只有一个整数r,1≤r≤8000。然后r行,每行两个正整数,表示数对(A, B),A间谍掌握B间谍的证据。

输出格式:

如果可以控制所有间谍,第一行输出YES,并在第二行输出所需要支付的贿金最小值。否则输出NO,并在第二行输出不能控制的间谍中,编号最小的间谍编号。

输入输出样例

输入样例#1:

  1. 【样例1
  2. 3
  3. 2
  4. 1 10
  5. 2 100
  6. 2
  7. 1 3
  8. 2 3
  9. 【样例2
  10. 4
  11. 2
  12. 1 100
  13. 4 200
  14. 2
  15. 1 2
  16. 3 4
输出样例#1:

  1. 【样例1
  2. YES
  3. 110
  4. 【样例2
  5. NO
  6. 3
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<stack>
  5. using namespace std;
  6. #define maxn 20000+5
  7. const int INF=1e9;
  8. int n,m,cz,tot,head[maxn],dfn[maxn],low[maxn],p[maxn];
  9. int belong[maxn],cur,visx,ru[maxn],smon[maxn];
  10. bool exist[maxn];
  11. stack<int>st;
  12. struct Edge{
  13. int to,next;
  14. }e[+];
  15. void Add_Edge(int u,int v){
  16. e[++tot].to=v;e[tot].next=head[u];
  17. head[u]=tot;
  18. }
  19. void Tarjan(int u){
  20. dfn[u]=low[u]=++visx;
  21. st.push(u);exist[u]=true;
  22. for(int i=head[u];i;i=e[i].next){
  23. int v=e[i].to;
  24. if(dfn[v]==){
  25. Tarjan(v);
  26. low[u]=min(low[u],low[v]);
  27. }
  28. else if(exist[v])low[u]=min(dfn[v],low[u]);
  29. }
  30. int x;
  31. if(low[u]==dfn[u]){
  32. smon[u]=;
  33. do{
  34. x=st.top();st.pop();exist[x]=false;
  35. belong[x]=u;
  36. smon[u]=min(smon[u],p[x]);
  37. // 对于一个环 只收买 代价最少的那个人即可
  38. }while(x!=u);
  39. }
  40. }
  41. int totvis=,vis[maxn];
  42. void DFS(int x){
  43. if(vis[x])return ;
  44. vis[x]=;totvis++;
  45. for(int i=head[x];i;i=e[i].next)
  46. DFS(e[i].to);
  47. }
  48. int main()
  49. {
  50. scanf("%d%d",&n,&cz);
  51. for(int i=;i<=n;i++) p[i]=INF;
  52. for(int i=,x,y;i<=cz;i++){
  53. scanf("%d%d",&x,&y);
  54. p[x]=y;
  55. }
  56. scanf("%d",&m);
  57. for(int i=,x,y;i<=m;i++){
  58. scanf("%d%d",&x,&y);
  59. Add_Edge(x,y);
  60. }
  61. for(int i=;i<=n;i++)
  62. if(p[i]!=INF)DFS(i);
  63. // 从可以收买的人那里深搜 看是否能够得到所有人的情报
  64. if(totvis<n)
  65. for(int i=;i<=n;i++)
  66. if(vis[i]==){
  67. printf("NO\n%d",i);
  68. return ;
  69. }// 处理 NO 的情况
  70.  
  71. for(int i=;i<=n;i++)
  72. if(!dfn[i]&&p[i]!=INF)// p[i] 收买第i个人花p[i]的钱
  73. Tarjan(i);
  74.  
  75. for(int i=;i<=n;i++)
  76. for(int j=head[i];j;j=e[i].next){
  77. if(belong[i]!=belong[e[j].to])
  78. ru[belong[e[j].to]]++;
  79. }
  80. int ans=;
  81. for(int i=;i<=n;i++)
  82. if(belong[i]==i&&!ru[i])
  83. ans+=smon[i];
  84.  
  85. printf("YES\n%d",ans);
  86. return ;
  87. }
  1. 先来一道省选-,练练手
    我在Codevs上总耗时20ms,很不解他为什么时间限制10s

洛谷 P1262 间谍网络==Codevs 4093 EZ的间谍网络的更多相关文章

  1. codevs 4093 EZ的间谍网络

    时间限制: 10 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 由于外国间谍的大量渗入,学校安全正处于高度的危机之中.YJY决定挺身而作出反抗 ...

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

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

  3. 【题解】洛谷P1262 间谍网络 (强连通分量缩点)

    洛谷P1262:https://www.luogu.org/problemnew/show/P1262 思路 一看题目就知道是强连通分量缩点 当图中有强连通分量时 将其缩点 我们可以用dfn数组判断是 ...

  4. 洛谷P1395 会议(CODEVS.3029.设置位置)(求树的重心)

    To 洛谷.1395 会议 To CODEVS.3029 设置位置 题目描述 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会 ...

  5. 洛谷 P1262 【间谍网络】

    题库 : 洛谷 题号 : 1262 题目 : 间谍网络 link : https://www.luogu.org/problemnew/show/P1262 思路 : 这题可以用缩点的思想来做.先用T ...

  6. 洛谷——P1262 间谍网络

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

  7. 「洛谷P1262」间谍网络 解题报告

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

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

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

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

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

随机推荐

  1. rand()和srand()

    C++中rand() 函数的用法 1.rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数. 2.如果你要产生0~99这100个整数中的一个随机整数, ...

  2. 微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)

    微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞 ...

  3. JZOJ 5809. 【NOIP2008模拟】数羊

    5809. [NOIP2008模拟]数羊 (File IO): input:sheep.in output:sheep.out Time Limits: 1000 ms  Memory Limits: ...

  4. JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)

    3461. [NOIP2013模拟联考5]小麦亩产一千八(kela) (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Det ...

  5. 基于django的个人博客网站建立(三)

    基于django的个人博客网站建立(三) 前言 网站效果可点击这里访问 今天主要完成的是文章在页面的显示以及评论,留言 具体内容 首先我希望主页面是显示我的所有文章,于是在主页面的视图函数中返回了所有 ...

  6. UVA - 10213 How Many Pieces of Land?(欧拉公式 + 高精度)

    圆上有n个点,位置不确定.问这些点两两连接成的线段,最多可以把圆划分成多少块平面? 欧拉公式:V-E+F = 2,V是点数,E是边数,F是面数. 答案是F=C(n,4)+C(n,2)+1,看的别人推的 ...

  7. RDD算子、RDD依赖关系

    RDD:弹性分布式数据集, 是分布式内存的一个抽象概念 RDD:1.一个分区的集合, 2.是计算每个分区的函数 ,    3.RDD之间有依赖关系 4.一个对于key-value的RDD的Partit ...

  8. redis 之相关命令

    为什么缓存数据库更要首选redis?如何使用redis? 一.使用缓存数据库为什么首选用redis? 我们都知道,把一些热数据存到缓存中可以极大的提高速度,那么问题来了,是用Redis好还是Memca ...

  9. loj2063 「HAOI2016」字符合并

    ref #include <iostream> #include <cstring> #include <cstdio> using namespace std; ...

  10. IOS开发---菜鸟学习之路--(十一)-使新闻内容自适应高度

    上一章当中,我们留了一个小BUG. 其实就是浏览新闻的时候,如果文字内容过长的花,UITextView 会有个下拉框,而最底层的UIScrollView也有个下拉框,那么在使用的时候就会非常的不爽. ...