题面

这道题太神了吧,从昨晚七点半做到今天下午两点.

我经历了以下折腾(以下内容可跳过):

  • 一开始想的是用Tarjan缩点,然后以可以被收买的间谍为起点跑最短路,通过路径染色,让一条路径上的点的权值等于起点(也就是可以被收买的美国间谍的编号),然后枚举每一个点,用它对应的路径,累加权值得到答案,如果有点的权值为正无穷,那么就说明有间谍无法收买,再扫一遍染色数组找出编号最小的点输出NO.

这种方式貌似可以,但是在跑最短路的时候,松弛操作会把权值更小的路径更新进来,但是这条最短路可能是无法确保跑向权值更大的点的前缀点的,所以说会导致权值反而更大.这种方法最高得了52分.

比如下面这张图:

1,2,3,4号点明显是个强联通分量,收买这个分量的代价为10.

5号点也是一个强连通分量,收买它的代价为20.

该图只有从5号点开始,才可以遍历完所有的点,总代价为20.

但是在跑最短路时,进入缩过点后的1,2,3,4节点后,会把这个点的权值松弛为10,但是这个10是无法跑完整个图的,这也导致总代价变为了30;

  • 然后我甚至想缩点之后跑一边最小生成树,但是算了下这样做会超时.

  • 之后我又想好了好久,和zxs大佬在中午恰饭的时候交流了下这道题,才想出来可以记录下所有入度为0的点,然后累加这些点的权值.这是因为入度为0的点是一定要被收买的,不然就无法遍历完全图,如果有间谍点无法被收买而且无法被其他间谍告发,就输出NO.

还有一些细节在代码里解释罢,各位在阅读我的变量名时只用看下划线后的部分.

代码:


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>using namespace std;stack<int>s;struct edge
{int to,next;
}e[10010];int OddToThePeoplesVolunteerArmy_n,GreatSoviet_p,TheSovietUnion_CntSize,PeoplesRupublic_TimeCnt,YpaForOurGreatMotherland_r,TheDefenderOfMoscow_size,TheInternationalMustCometrue_ans;
int head[10010],dfn[10010],low[10010],indu[10010],dis[10010],color[10010],Nodedis[10010];
bool flag[10010];void EdgeAdd(int,int);
void Tarjan(int);int main()
{memset(head,-1,sizeof(head));memset(Nodedis,0x3f,sizeof(Nodedis));memset(dis,0x3f,sizeof(dis));scanf("%d%d",&OddToThePeoplesVolunteerArmy_n,&GreatSoviet_p);for(int _=1;_<=GreatSoviet_p;_++){int id,USAIsRubbish;scanf("%d%d",&id,&USAIsRubbish);dis[id]=USAIsRubbish;}scanf("%d",&YpaForOurGreatMotherland_r);for(int _=1;_<=YpaForOurGreatMotherland_r;_++){int father,son;scanf("%d%d",&father,&son);EdgeAdd(father,son);}for(int _=1;_<=OddToThePeoplesVolunteerArmy_n;_++){if(dfn[_]==0&&dis[_]!=0x3f3f3f3f)//把可以收买的美国间谍进入Tarjan缩点,这样缩出来的点才能够被遍历.{Tarjan(_);}}for(int _=1;_<=OddToThePeoplesVolunteerArmy_n;_++)//缩完点后如果存在无法被收买,又无法被其它间谍指控的点,就说明无法收买所有间谍.{if(dfn[_]==0){printf("NO\n%d\n",_);return 0;}}for(int _=1;_<=OddToThePeoplesVolunteerArmy_n;_++){for(int __=head[_];__!=-1;__=e[__].next){int to=e[__].to;if(color[_]!=color[to]){indu[color[to]]++;//统计入度.}}}for(int _=1;_<=TheSovietUnion_CntSize;_++){if(indu[_]==0)//累加必须收买的间谍的代价.{TheInternationalMustCometrue_ans+=Nodedis[_];
//            printf("Nodedis:%d\n",Nodedis[_]);}}printf("YES\n%d\n",TheInternationalMustCometrue_ans);
return 0;
}void EdgeAdd(int from,int to)
{e[++TheDefenderOfMoscow_size].to=to;e[TheDefenderOfMoscow_size].next=head[from];head[from]=TheDefenderOfMoscow_size;
}void Tarjan(int FuckTrump_from)
{dfn[FuckTrump_from]=low[FuckTrump_from]=++PeoplesRupublic_TimeCnt;s.push(FuckTrump_from);flag[FuckTrump_from]=true;for(int _=head[FuckTrump_from];_!=-1;_=e[_].next){int to=e[_].to;if(dfn[to]==0){Tarjan(to);low[FuckTrump_from]=min(low[FuckTrump_from],low[to]);}else if(flag[to]==true){low[FuckTrump_from]=min(low[FuckTrump_from],dfn[to]);}}if(dfn[FuckTrump_from]==low[FuckTrump_from]){TheSovietUnion_CntSize++;while(!s.empty()){int RedAmryIsTheStrongest_temp=s.top();s.pop();flag[RedAmryIsTheStrongest_temp]=false;color[RedAmryIsTheStrongest_temp]=TheSovietUnion_CntSize;Nodedis[TheSovietUnion_CntSize]=min(Nodedis[TheSovietUnion_CntSize],dis[RedAmryIsTheStrongest_temp]);//缩点后的点的代价为原来的环的代价中最小的那个代价.color[RedAmryIsTheStrongest_temp]=TheSovietUnion_CntSize;//染色.if(RedAmryIsTheStrongest_temp==FuckTrump_from)break;}}
}

转载于:https://www.cnblogs.com/Lemir3/p/11097721.html

P1262_美帝的间谍网络被我部捕获!相关推荐

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

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

  2. P1262 间谍网络

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

  3. 洛谷P1262 间谍网络题解

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

  4. ns-3-model-library wifi 浅析_ns-3wifi部分解析_ns-3网络模拟器wifi部分文档分析_Part2

    ns(来源于"network simulator")是一系列离散事件网络模拟器,包括ns-1.ns-2和ns-3.他们主要应用于研究和教学.ns-3是自由软件,以GNU GPLv2 ...

  5. python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03

    python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03 参考文章: (1)python网络编程-异常处理-异常捕获-抛出异常-断言-自 ...

  6. 实验二 简单网络命令和wireshark捕获FTP用户名密码

    实验二 简单网络命令和wireshark捕获FTP用户名密码 预备知识 Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的 ...

  7. 推荐四部值得刷10遍的网络小说,部部经典,让你一次看过瘾!

    (以下图片均来自网络,若有侵权,告之则删!) 1.<神墓>:<神墓>是笔者觉得辰东写得最有意思的一部网络小说,兼顾西方元素与东方神话,从神魔陵园入手,一点点掀开世界的大局.万年 ...

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

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

  9. loj10095 间谍网络

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

最新文章

  1. 移动web开发---第二天
  2. boost::math::filters::daubechies_scaling_filter用法的测试程序
  3. 统计学习方法第四章课后习题(转载+重新排版+自己解读)
  4. 前端实战:仿写小米官网第一天
  5. 怎么看b树是几阶_数据库原理基础:设计B树与B+树的目的以及二者的优劣
  6. 自动部署java项目,热部署方式
  7. Android 内存泄漏检测工具
  8. 2000坐标系转经纬度工具_【Leaflet开发】L.CRS + 搞定Leaflet多坐标系拓展
  9. Checkio代码闯关小计
  10. flask-session组件
  11. 25 张图,一万字,拆解 Linux 网络包发送过程
  12. Vue进阶(四十七):面试必备:2022 Vue经典面试题总结(含答案)
  13. Tomcat8.5后版本不返回200 OK的问题解决
  14. 使用golang链接达梦数据库
  15. hellow aiowo
  16. 高防服务器防御阈值买多大合适呢?
  17. mysql的查询分析工具下载_万能数据库查询分析器(ODBC数据库查询分析工具)V7.03 最新版...
  18. 进程之joinableQueue
  19. 表单验证-----验证图片格式
  20. Multisim基础 有极性的电容 添加元件的位置

热门文章

  1. Juniper NetScreen 基于源NAT转换
  2. (原创)惠州市惠阳区房价偏低的原因深入分析
  3. ethz ‘s choice for graduate studies
  4. linux cp命令使用
  5. Unity 中使用Async-Await替代 coroutines
  6. C#中使用DLL相关问题
  7. hbase的集群搭建
  8. Android原生绘图进度条+简单自定义属性代码生成器
  9. yii2 / 在这里有个叫BaseDataProvider的老爹
  10. shell,自动挂载磁盘