【洛谷P1262】 间谍网络

题目描述

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

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

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

一个环内的点当做一个点,进行有向图缩点,缩点之后的点权就是该点包括的点的点权最小值。

之后重新建图,对于每个点如果他的点权不是无限大,那么就可以从他开始扩展,dfn就可以解决。不过有一点问题,就是如果可以遍历所有点,那么我们是需要输出最小代价的。

那么尝试hack一下现在的做法。

可以发现,确实会有地方多计算了点权。

比如下面这个图。

按照当前做法,1号点的点权10也会被计算到答案里,但是我们只需要5号点的点权20就可以了。

所以就有了一个优化,就是统计重新建图之后每个点的入度,然后从入度为零的点开始遍历。

之后再去从入度不为零的点遍历。

code:

#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;const int wx=50017;inline int read(){int sum=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}return sum*f;
}int tot,st[wx],top,col,n,p,m;
int head[wx],h[wx],num,Num;
int dfn[wx],low[wx],belong[wx],size[wx],a[wx],v[wx],vis[wx];
int in[wx];struct e{int nxt,to;
}edge[wx*2];void add(int from,int to){edge[++num].nxt=head[from];edge[num].to=to;head[from]=num;
}void Tarjan(int u){dfn[u]=low[u]=++tot;st[++top]=u;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if(!dfn[v]){Tarjan(v);low[u]=min(low[u],low[v]);}else if(!belong[v]){low[u]=min(low[u],dfn[v]);}}if(low[u]==dfn[u]){belong[u]=++col;size[col]++;while(st[top]!=u){belong[st[top]]=col;size[col]++;top--;}top--;}
}struct node{int nxt,to;
}e[wx*2];void Add(int from,int to){e[++Num].nxt=h[from];e[Num].to=to;h[from]=Num;
}void dfs(int u){vis[u]=1;for(int i=h[u];i;i=e[i].nxt){int v=e[i].to;if(vis[v])continue;dfs(v);}
}int main(){n=read(); p=read();memset(a,0x3f,sizeof a);memset(v,0x3f,sizeof v);for(int i=1;i<=p;i++){int x; x=read(); a[x]=read();}m=read();for(int i=1;i<=m;i++){int x,y;x=read(); y=read();add(x,y);}for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i);for(int i=1;i<=n;i++)v[belong[i]]=min(v[belong[i]],a[i]);for(int u=1;u<=n;u++){for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if(belong[v]!=belong[u])in[belong[v]]++,Add(belong[u],belong[v]);}}int ans=0;for(int i=1;i<=col;i++){if(v[i]!=0x3f3f3f3f&&vis[i]==0&&in[i]==0){if(i==1)vis[i]=1;ans+=v[i];dfs(i);}}for(int i=1;i<=col;i++){if(v[i]!=0x3f3f3f3f&&vis[i]==0){if(i==1)vis[i]=1;ans+=v[i];dfs(i);}}for(int i=1;i<=n;i++){if(!vis[belong[i]]){puts("NO");printf("%d\n",i); return 0;}}puts("YES");printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/wangxiaodai/p/9826762.html

缩点【洛谷P1262】 间谍网络相关推荐

  1. 洛谷P1262 间谍网络题解

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

  2. 洛谷P1262 间谍网络

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

  3. 洛谷1262 间谍网络 tarjan缩点

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

  4. P3387 【模板】缩点 洛谷 java题解 连通图+拓扑排序

    传送门: P3387 [模板]缩点 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3387 问题分析 首先为了节省 ...

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

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

  6. P1262 间谍网络

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

  7. Luogu P1262 间谍网络 【强连通分量/缩点】By cellur925

    题目传送门 真是一道好题呀~~~~qwq 知道这题是tarjan,但是想了很久怎么用上强连通分量.因为样例们...它显然并不是一个强联通分量! (被样例迷惑的最好例子) 然后...就没有然后了...感 ...

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

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

  9. 洛谷P1546 最短网络 Agri-Net

    P1546 最短网络 Agri-Net 526通过 959提交 题目提供者JOHNKRAM 标签图论贪心USACO 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 50分C++代码,求解 请指 ...

最新文章

  1. c#_MessageBox 消息对话框
  2. python编程实例下载-python网络编程之文件下载实例分析
  3. scrollToItemAtIndexPath使用
  4. php pclzip.lib.php,php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
  5. Sql Server系列:存储过程
  6. 针对plsql developer使用做的三个小设置
  7. mysql+after+commit_Spring事务aftercommit原理及实践
  8. android 开发不能创建目录
  9. 基于Redis实现的抢购代码示例
  10. Excel 列累加技巧
  11. IDEA 2017 破解 license 激活
  12. 微信朋友圈设计方案简述
  13. Linux系统磁盘分区及挂载 - fdisk
  14. poi生成excel整理(设置边框/字体/颜色/加粗/居中/)
  15. 请用python代码表示什么_深度解析什么是二维码?用Python 5行代码生成个性二维码...
  16. 雄牛PVC地板革新胶地板行业成环保绿色新选择
  17. 低成本创业必知的五个“基本点”
  18. Vue之下载所有选中连接
  19. FFmpeg4入门07:解码视频并保存为YUV格式文件
  20. class类中的__len__方法的作用

热门文章

  1. 2020最新直播源地址下载txt_TXT追书免费小说app安卓版下载-TXT追书免费小说最新版下载v5.0.0...
  2. 第77课 交作业啦(递归算法)
  3. ThinkPHP框架在linux服务器nginx环境下跑出现溢出缓存问题解决方法
  4. nuxt解决首屏加载慢问题_如何解决百度云盘下载速度慢的问题
  5. Python工作笔记-解决python使用nohup后台运行重定向不输出问题
  6. 前端笔记-CSS布局使得网页分成3部(头,内容,脚)
  7. Linux工作笔记-CentOS 调整 home分区 扩大 root分区
  8. Qt工作笔记-Qt奇淫技巧把ToolBar改成标题栏
  9. Qt工作笔记-moc的认识
  10. WEB安全基础-SQL注入演示