题目传送门

真是一道好题呀~~~~qwq

知道这题是tarjan,但是想了很久怎么用上强连通分量。因为样例们...它显然并不是一个强联通分量!

(被样例迷惑的最好例子)

然后...就没有然后了...感觉自己被欺骗了。脑补了一些别的做法,向题解低头。


$Sol$

这个时候我们其实需要一些冷静分析。分情况讨论。

  • 判断无解性。什么时候无解?当存在一个间谍既不能被收买也没有被其他间谍掌握自己的资料,则无解。我们在主函数进行tarjan操作时,是从能被收买的间谍开始找环的。那么最后递归结束,当存在间谍没被访问($!dfn[i]$),那么问题无解。
  • 那么有解的情况呢?这时条件等价于所有的间谍都能直接或间接地被收买或被掌握。这时分两种情况:正如我思考时,分有环和无环两种情况。没还,资金就需要给那个没有入度的间谍;有环,我们就把资金给那个在环里资金最小的间谍(因为在一个强联通分量中,所以一个点可达另一个节点,这个环就解决了,我们肯定想要给资金需要少的。这部分处理可在tarjan中顺便求出)。有环的情况我们通常对它进行缩点,成为一个有向无环图,也就变成了无环的情况。
  • 小结。缩点->DAG这是比较套路的东西了,大多数时候我们其实不用新建一个图,而都是在统计入度(这种场合较多)。
  • 结论。还是我太弱了qwq。

$Code$

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<stack>
 4 #include<cstring>
 5 #define maxn 4000
 6
 7 using namespace std;
 8
 9 int n,p,tot,r,dfs_clock,scc_cnt,ans;
10 int head[maxn],val[maxn],rdu[maxn],dfn[maxn],low[maxn],scc[maxn],price[maxn];
11 bool buy[maxn];
12 struct node{
13     int to,next;
14 }edge[maxn*2];
15 stack<int>s;
16
17 void add(int x,int y)
18 {
19     edge[++tot].to=y;
20     edge[tot].next=head[x];
21     head[x]=tot;
22 }
23
24 void tarjan(int u)
25 {
26     dfn[u]=low[u]=++dfs_clock;
27     s.push(u);
28     for(int i=head[u];i;i=edge[i].next)
29     {
30         int v=edge[i].to;
31         if(!dfn[v])
32         {
33             tarjan(v);
34             low[u]=min(low[u],low[v]);
35         }
36         else if(!scc[v]) low[u]=min(low[u],dfn[v]);
37     }
38     if(dfn[u]==low[u])
39     {
40         scc_cnt++;
41         while(1)
42         {
43             int x=s.top();s.pop();
44             scc[x]=scc_cnt;
45             val[scc_cnt]=min(val[scc_cnt],price[x]);
46             if(x==u) break;
47         }
48     }
49 }
50
51 int main()
52 {
53     scanf("%d%d",&n,&p);
54     memset(price,127,sizeof(price));
55     memset(val,127,sizeof(val));
56     for(int i=1;i<=p;i++)
57     {
58         int x=0;
59         scanf("%d",&x);
60         buy[x]=1;
61         scanf("%d",&price[x]);
62     }
63     scanf("%d",&r);
64     for(int i=1;i<=r;i++)
65     {
66         int x=0,y=0;
67         scanf("%d%d",&x,&y);
68         add(x,y);
69     }
70     for(int i=1;i<=n;i++)
71         if(!dfn[i]&&buy[i]) tarjan(i);
72     for(int i=1;i<=n;i++)
73         if(!dfn[i]){ans=i;break;}
74     if(ans) {printf("NO\n%d",ans);return 0;}
75     printf("YES\n");
76     for(int x=1;x<=n;x++)
77         for(int i=head[x];i;i=edge[i].next)
78         {
79             int y=edge[i].to;
80             if(scc[x]==scc[y]) continue;
81             rdu[scc[y]]++;
82         }
83     for(int i=1;i<=scc_cnt;i++)
84         if(rdu[i]==0) ans+=val[i];
85     printf("%d",ans);
86     return 0;
87 }

View Code


$Warning$

那个最后缩点的时候这个地方比较容易写错。最后是在$scc_cnt$上进行操作的。

    for(int x=1;x<=n;x++)for(int i=head[x];i;i=edge[i].next){int y=edge[i].to;if(scc[x]==scc[y]) continue;rdu[scc[y]]++;}for(int i=1;i<=scc_cnt;i++)if(rdu[i]==0) ans+=val[i];

转载于:https://www.cnblogs.com/nopartyfoucaodong/p/9733577.html

Luogu P1262 间谍网络 【强连通分量/缩点】By cellur925相关推荐

  1. tyvj间谍网络(强连通分量)题解

    题目描述见下列网址 http://www.tyvj.cn/  (P1153) 经过对题目的分析,可以得出,题目的要求就是求出图中的强连通分量连,然后进行缩点操作,最后枚举每一个入度为0的点,如果可以有 ...

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

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

  3. 洛谷P1262 间谍网络题解

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

  4. POJ1236Network of Schools——强连通分量缩点建图

    [题目描述] A number of schools are connected to a computer network. Agreements have been developed among ...

  5. HDU 5934:Boom——强连通分量+缩点

    [题目描述] There are N bombs needing exploding.Each bomb has three attributes: exploding radius ri, posi ...

  6. 【差分约束系统】【强连通分量缩点】【拓扑排序】【DAG最短路】CDOJ1638 红藕香残玉簟秋,轻解罗裳,独上兰舟。...

    题意: 给定n个点(点权未知)和m条信息:u的权值>=v的权值+w 求点权的极小解和极大解(无解则输出-1) 极小解即每个点的点权可能的最小值 极大解即每个点的点权可能的最大值 题解: 差分约束 ...

  7. The King’s Problem(tarjan求强连通分量缩点+匈牙利求有向无环图的最小路径覆盖)

    Link:http://acm.hdu.edu.cn/showproblem.php?pid=3861 The King's Problem Time Limit: 2000/1000 MS (Jav ...

  8. P1262 间谍网络 (Tarjan 求强连通分量)

    题目传送门:https://www.luogu.com.cn/problem/P1262 题意 题意转换成图的角度理解,给出初始可以访问的节点 D i D_i Di​ 以及访问这些节点需要的代价 W ...

  9. P1262 间谍网络

    传送门 思路: ①在 Tarjan 的基础上加一个 belong 记录每个点属于哪个强连通分量. ②存图完成后,暴力地遍历全图,查找是否要间谍不愿受贿. inline void dfs(int u) ...

最新文章

  1. 高级驾驶辅助系统ADAS
  2. callable函数 stride的意义 Math.round(),Math.ceil(),Math.floor()用法
  3. c#endread怎么打印出来_c# – Socket.EndRead 0字节意味着断开连接?
  4. 共享上网 路由器设置图解
  5. VC按最小化、关闭按钮、Esc都隐藏主窗口
  6. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...
  7. 2021-08-20 解决layUi 选项卡切换表格大小不匹配问题
  8. 远场语音识别套件评测
  9. 【算法基础】动态规划的理解
  10. Android学习笔记之如何将数据保存到SDCard
  11. 【Selenium】1.介绍 Selenium
  12. 分享一个不错的数据分析实战案例【全程附图】EXCEL
  13. 詹森不等式的积分形式
  14. 计算机网络水平子系统布线图,综合布线七大子系统构成图
  15. [HCIP]MPLS解决路由黑洞
  16. 微信小程序横屏字体变大的完美解决方案
  17. 散论陈寅恪先生《对科学院的答复》
  18. 网页右下角弹出广告窗口 超简洁
  19. 微信小程序设置顶部navigationBar为颜色渐变
  20. 时间转换——Java

热门文章

  1. 解决windows远程(Telnet)最大连接数的问题
  2. 网站中人性化提示信息的JavaScript实现
  3. 解析Spring IOC原理——工厂模式与反射机制的综合应用
  4. linkbutton控件中使用CommandName属性和CommandArgument属性
  5. Android开发-将自定义View布局到Layout中并调用
  6. Android 手把手教您自定义ViewGroup
  7. 如何利用抽象工厂更换数据库
  8. 进程知识点,只需这一篇
  9. 汇编语言--jcxz指令
  10. linux下/proc/cpuinfo文件