Luogu P1262 间谍网络 【强连通分量/缩点】By cellur925
题目传送门
真是一道好题呀~~~~qwq
知道这题是tarjan,但是想了很久怎么用上强连通分量。因为样例们...它显然并不是一个强联通分量!
(被样例迷惑的最好例子)
然后...就没有然后了...感觉自己被欺骗了。脑补了一些别的做法,向题解低头。
$Sol$
这个时候我们其实需要一些冷静分析。分情况讨论。
- 判断无解性。什么时候无解?当存在一个间谍既不能被收买也没有被其他间谍掌握自己的资料,则无解。我们在主函数进行tarjan操作时,是从能被收买的间谍开始找环的。那么最后递归结束,当存在间谍没被访问($!dfn[i]$),那么问题无解。
- 那么有解的情况呢?这时条件等价于所有的间谍都能直接或间接地被收买或被掌握。这时分两种情况:正如我思考时,分有环和无环两种情况。没还,资金就需要给那个没有入度的间谍;有环,我们就把资金给那个在环里资金最小的间谍(因为在一个强联通分量中,所以一个点可达另一个节点,这个环就解决了,我们肯定想要给资金需要少的。这部分处理可在tarjan中顺便求出)。有环的情况我们通常对它进行缩点,成为一个有向无环图,也就变成了无环的情况。
- 小结。缩点->DAG这是比较套路的东西了,大多数时候我们其实不用新建一个图,而都是在统计入度(这种场合较多)。
- 结论。还是我太弱了qwq。
$Code$
![](/assets/blank.gif)
![](/assets/blank.gif)
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相关推荐
- tyvj间谍网络(强连通分量)题解
题目描述见下列网址 http://www.tyvj.cn/ (P1153) 经过对题目的分析,可以得出,题目的要求就是求出图中的强连通分量连,然后进行缩点操作,最后枚举每一个入度为0的点,如果可以有 ...
- P1262 间谍网络 (tarjan缩点 水过去)
题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...
- 洛谷P1262 间谍网络题解
洛谷P1262 间谍网络题解 题目大意 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果 A 间谍手中掌握着关于 B 间谍的犯罪证据,则称 A 可以揭发 B.有些间谍收受贿赂,只要 ...
- POJ1236Network of Schools——强连通分量缩点建图
[题目描述] A number of schools are connected to a computer network. Agreements have been developed among ...
- HDU 5934:Boom——强连通分量+缩点
[题目描述] There are N bombs needing exploding.Each bomb has three attributes: exploding radius ri, posi ...
- 【差分约束系统】【强连通分量缩点】【拓扑排序】【DAG最短路】CDOJ1638 红藕香残玉簟秋,轻解罗裳,独上兰舟。...
题意: 给定n个点(点权未知)和m条信息:u的权值>=v的权值+w 求点权的极小解和极大解(无解则输出-1) 极小解即每个点的点权可能的最小值 极大解即每个点的点权可能的最大值 题解: 差分约束 ...
- 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 ...
- P1262 间谍网络 (Tarjan 求强连通分量)
题目传送门:https://www.luogu.com.cn/problem/P1262 题意 题意转换成图的角度理解,给出初始可以访问的节点 D i D_i Di 以及访问这些节点需要的代价 W ...
- P1262 间谍网络
传送门 思路: ①在 Tarjan 的基础上加一个 belong 记录每个点属于哪个强连通分量. ②存图完成后,暴力地遍历全图,查找是否要间谍不愿受贿. inline void dfs(int u) ...
最新文章
- 高级驾驶辅助系统ADAS
- callable函数 stride的意义 Math.round(),Math.ceil(),Math.floor()用法
- c#endread怎么打印出来_c# – Socket.EndRead 0字节意味着断开连接?
- 共享上网 路由器设置图解
- VC按最小化、关闭按钮、Esc都隐藏主窗口
- [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...
- 2021-08-20 解决layUi 选项卡切换表格大小不匹配问题
- 远场语音识别套件评测
- 【算法基础】动态规划的理解
- Android学习笔记之如何将数据保存到SDCard
- 【Selenium】1.介绍 Selenium
- 分享一个不错的数据分析实战案例【全程附图】EXCEL
- 詹森不等式的积分形式
- 计算机网络水平子系统布线图,综合布线七大子系统构成图
- [HCIP]MPLS解决路由黑洞
- 微信小程序横屏字体变大的完美解决方案
- 散论陈寅恪先生《对科学院的答复》
- 网页右下角弹出广告窗口 超简洁
- 微信小程序设置顶部navigationBar为颜色渐变
- 时间转换——Java