loj10095 间谍网络
题目描述
由于外国间谍的大量渗入,国家安全正处于高度危机之中。如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B。有些间谍接受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报。所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子。因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报。
我们的反间谍机关提供了一份资料,包括所有已知的受贿的间谍,以及他们愿意收受的具体数额。同时我们还知道哪些间谍手中具体掌握了哪些间谍的资料。假设总共有n个间谍,每个间谍分别用1到n的整数来标识。
请根据这份资料,判断我们是否可能控制全部的间谍,如果可以,求出我们所需要支付的最少资金。否则,输出不能被控制的一个间谍。
输入格式
第一行只有一个整数n。第二行是整数p。表示愿意被收买的人数。
接下来的p行,每行有两个整数,第一个数是一个愿意被收买的间谍的编号,第二个数表示他将会被收买的数额。
紧跟着一行只有一个整数r。然后r行,每行两个正整数,表示数对(A,B) ,A间谍掌握B间谍的证据。
输出格式
如果可以控制所有间谍,第一行输出YES,并在第二行输出所需要支付的贿金最小值。否则输出NO,并在第二行输出不能控制的间谍中,编号最小的间谍编号。
样例
样例输入
2
1
2 512
2
1 2
2 1
样例输出
YES
512
数据范围与提示
1<=n<=3000,1<=p<=n,1<=r<=8000,每个收买的费用为非负数且不超过20000。
------------------------------------------------------------------------------------------------------------------
首先,将各个强连通分量进行缩点,建立新图,求出第一分量的入度。
然后,并记录每一个分量中的最小点编号和分量内点中能买通的最少花费。
第三,把每一个分量标明是否可以被买通,入度为0的分量的最小花费和就是整个图的最少花费和。
第四步,拓扑排序,把所有可以买通的点的后续点都设为可以买通。
第五步,所有不可买通的分量中编号最小的点的编号就是不可买通的最小编号。
最后,通过最小编号是否求出可以判断是否可以全部买通。从而输出相应的内容。
------------------------------------------------------------------------------------------------------------------
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=3010;
4 const int maxm=8010;
5 int n,m,p;
6 struct edge
7 {
8 int u,v,nxt;
9 }e[maxm];
10 int head[maxn],js;
11 void addage(int u,int v)
12 {
13 e[++js].u=u;e[js].v=v;
14 e[js].nxt=head[u];head[u]=js;
15 }
16 int sm[maxn][2];
17 int dfn[maxn],low[maxn],st[maxn],top,cnt,lt[maxn],lts;
18 void tarjan(int u)
19 {
20 dfn[u]=low[u]=++cnt;
21 st[++top]=u;
22 for(int i=head[u];i;i=e[i].nxt)
23 {
24 int v=e[i].v;
25 if(!dfn[v])
26 {
27 tarjan(v);
28 low[u]=min(low[u],low[v]);
29 }
30 else if(!lt[v])
31 low[u]=min(low[u],dfn[v]);
32 }
33 if(low[u]==dfn[u])
34 {
35 lt[u]=++lts;
36 while(st[top]!=u)lt[st[top--]]=lts;
37 --top;
38 }
39 }
40 int rd[maxn],msm[maxn];
41 edge ee[maxm];
42 int headd[maxn],jss;
43 void addagee(int u,int v)
44 {
45 ee[++jss].u=u;ee[jss].v=v;
46 ee[jss].nxt=headd[u];headd[u]=jss;
47 }
48 queue<int>q;
49 bool ksm[maxn];
50 int mno[maxn];
51 int ans,mbk=0x7f7f7f7f;
52 int main()
53 {
54 scanf("%d%d",&n,&p);
55 for(int i=1;i<=p;++i)
56 scanf("%d%d",&sm[i][0],&sm[i][1]);
57 scanf("%d",&m);
58 for(int u,v,i=0;i<m;++i)
59 {
60 scanf("%d%d",&u,&v);
61 addage(u,v);
62 }
63 for(int i=1;i<=n;++i)
64 if(!dfn[i])tarjan(i);
65 for(int i=1;i<=n;++i)
66 for(int j=head[i];j;j=e[j].nxt)
67 {
68 if(lt[i]!=lt[e[j].v])
69 {
70 rd[lt[e[j].v]]++;
71 addagee(lt[i],lt[e[j].v]);
72 }
73 }
74 memset(msm,0x7f,sizeof msm);
75 memset(mno,0x7f,sizeof mno);
76 for(int i=1;i<=p;++i)
77 if(msm[lt[sm[i][0]]]>sm[i][1])msm[lt[sm[i][0]]]=sm[i][1],ksm[lt[sm[i][0]]]=1;
78 for(int i=1;i<=n;++i)
79 if(i<mno[lt[i]])mno[lt[i]]=i;
80 for(int i=1;i<=lts;++i)
81 if(rd[i]==0)q.push(i),ans+=msm[i];
82 while(!q.empty())
83 {
84 int u=q.front();q.pop();
85 for(int i=headd[u];i;i=ee[i].nxt)
86 {
87 int v=ee[i].v;
88 rd[v]--;
89 if(ksm[u])ksm[v]=1;
90 if(rd[v]==0)q.push(v);
91 }
92 }
93 for(int i=1;i<=lts;++i)
94 {
95 if(!ksm[i])mbk=min(mbk,mno[i]);
96 }
97 if(mbk==0x7f7f7f7f)printf("YES\n%d",ans);
98 else printf("NO\n%d",mbk);
99 return 0;
100 }
loj10095 间谍网络的更多相关文章
- tyvj 1153 间谍网络 tarjan有向图强连通
P1153 - 间谍网络 From ForeverBell Normal (OI)总时限:13s 内存限制:128MB 代码长度限制:64KB 描述 Description 由于外国 ...
- Luogu P2002 消息扩散&&P1262 间谍网络
怕自己太久没写Tarjan了就会把这种神仙算法忘掉. 其实这种类型的图论题的套路还是比较简单且显然的. P2002 消息扩散 很显然的题目,因为在一个环(其实就是强连通分量)中的城市都只需要让其中一个 ...
- P1262 间谍网络
传送门 思路: ①在 Tarjan 的基础上加一个 belong 记录每个点属于哪个强连通分量. ②存图完成后,暴力地遍历全图,查找是否要间谍不愿受贿. inline void dfs(int u) ...
- 缩点【洛谷P1262】 间谍网络
[洛谷P1262] 间谍网络 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他 ...
- 洛谷 P1262 间谍网络==Codevs 4093 EZ的间谍网络
4093 EZ的间谍网络 时间限制: 10 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B ...
- 洛谷——P1262 间谍网络
P1262 间谍网络 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意 ...
- TYVJ P1153 间谍网络
P1153 间谍网络 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 由于外国间谍的大量渗入,国家安全正处于高度危机之中.如果A间谍手中掌握着关于B间谍的犯罪 ...
- 洛谷 P1262 【间谍网络】
题库 : 洛谷 题号 : 1262 题目 : 间谍网络 link : https://www.luogu.org/problemnew/show/P1262 思路 : 这题可以用缩点的思想来做.先用T ...
- 【JZOJ 3910】Idiot 的间谍网络
题面: Description 作为一名高级特工,Idiot 苦心经营多年,终于在敌国建立起一张共有n 名特工的庞大间谍网络. 当然,出于保密性的要求,间谍网络中的每名特工最多只会有一名直接领导.现在 ...
随机推荐
- [LeetCode]547. Friend Circles朋友圈数量--不相邻子图问题
/* 思路就是遍历所有人,对于每一个人,寻找他的好友,找到好友后再找这个好友的好友 ,这样深度优先遍历下去,设置一个flag记录是否已经遍历了这个人. 其实dfs真正有用的是flag这个变量,因为如果 ...
- C#设计模式——建造者模式(Builder Pattern)
1.建造者模式简介 1.1>.定义 建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 1.2>.使用频率 中低 1.3>.原型模式应用 ...
- SparkStreaming推测机制:面试被问遇到什么问题,说这个显水平!
背景 老刘最近晚上会刷刷牛客网的大数据开发面经,总是会看到一个高频的面试题,那就是你在学习过程中遇到过什么问题吗? 这个问题其实有点难回答,如果我说的太简单了,会不会让面试官觉得水平太低,那我应该讲什 ...
- Servlet3.0提供的@WebServlet注解引用参数详情介绍
Servlet3.0提供的@WebServlet注解: servlet3.0所提供的@webservlet注解,用来将某个类注解为一个servlet类,简化了web.xml上的servlet配置, @ ...
- spark的运行指标监控
sparkUi的4040界面已经有了运行监控指标,为什么我们还要自定义存入redis? 1.结合自己的业务,可以将监控页面集成到自己的数据平台内,方便问题查找,邮件告警 2.可以在sparkUi的基础 ...
- 分享一个的c++写的,模仿awk的框架类CAwkDoc
这是我好多年前,模仿awk写的. awk大家都比较熟悉,使用awk处理文件,读取文件,分割字段这些工作awk自己帮你实现了. 程序员只要编写业务逻辑代码,并且awk还提供了很多常用的字符串操作函数,可 ...
- String--常见面试题
String s = new String("xyz") 创建了几个对象? 实例分析1 javac编译代码,然后用javap来反编译,执行javap -c Test 从结果来看,l ...
- Solon rpc 之 SocketD 协议 - 消息鉴权模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- LeetCode701 二叉搜索树中插入结点
给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 保证原始二叉搜索树中不存在新值. 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜 ...
- 怎么判断innodb 日志缓冲区该设置为多大呢
怎么判断innodb 日志缓冲区该设置为多大呢