传送门

思路:

  ①在 Tarjan 的基础上加一个 belong 记录每个点属于哪个强连通分量。

  ②存图完成后,暴力地遍历全图,查找是否要间谍不愿受贿。

inline void dfs(int u)
{if(vis[u]) return ;vis[u]=true,tot++;for(int i=head[u];i;i=t[i].nex)dfs(t[i].to);
}//遍历

  遍历完后,看看那个间谍没被搜索过(vis数组记录),就把那个不受贿的间谍抓出来。

  ③如果所有的间谍都愿意受贿,就继续。可以开一个smon数组,记录每个强连通分量中间谍愿意受贿的最小的钱数。结合belong数组(因为一个强连通分量只要让一个间谍受贿,就能拖出这个强连通分量中所有的间谍。),用ans记录所需总的钱数,输出。

AC代码: 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
#include<deque>
using namespace std;
#define maxn 3001
#define maxm 9000000
#define INF 0x3f3f3f3f
int n,m,cnt,tot,dfn[maxn],low[maxn],sta[maxn],belong[maxn],rd[maxn],smon[maxn],mon[maxn];
//belong记录每个点属于哪个强连通分量,rd记录每个点的入度,smon记录间谍网络中每个连通块的最小受贿的钱,mon记录每个间谍的受贿所需的钱
bool vis[maxn];
struct hh
{int nex,to;
}t[maxm];
int tto=0,head[maxm];//链式前向星
inline void add(int nex,int to)
{t[++tto].nex=head[nex];t[tto].to=to;head[nex]=tto;
}//存图部分
inline void dfs(int u)
{if(vis[u]) return ;vis[u]=true,tot++;for(int i=head[u];i;i=t[i].nex)dfs(t[i].to);
}//遍历初始图
inline int read()
{char kr=0;char ls;for(;ls>'9'||ls<'0';kr=ls,ls=getchar());int xs=0;for(;ls>='0'&&ls<='9';ls=getchar()){xs=xs*10+ls-48;}if(kr=='-') xs=0-xs;return xs;
}//快读
inline void tarjan(int u)//tarjan的模板
{dfn[u]=low[u]=++tot;vis[u]=true;sta[++cnt]=u;for(int i=head[u];i;i=t[i].nex){int v=t[i].to;if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}else if(vis[v]){low[u]=min(low[u],dfn[v]);}}//日常操作 if(dfn[u]==low[u]){smon[u]=INF;do{vis[sta[cnt]]=false;belong[sta[cnt]]=u;smon[u]=min(smon[u],mon[sta[cnt]]);//取连通块中间谍受贿的最小值,更新smon cnt--;}while(sta[cnt+1]!=u);}
}
int main()
{n=read();m=read();for(int i=1;i<=n;i++)mon[i]=INF;//不受贿的间谍设为一个极大值 for(int i=1;i<=m;i++){int x,y;x=read();y=read();mon[x]=y;//读入受贿间谍要的钱
    }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(mon[i]!=INF)dfs(i);//遍历全图,确定是否有间谍不愿被收买for(int i=1;i<=n;i++){if(!vis[i])//找到那个不愿被收买的间谍
        {printf("NO\n%d",i);return 0;//直接结束程序
        }}tot=0;for(int i=1;i<=n;i++)vis[i]=0;//初始化vis for(int i=1;i<=n;i++)if(mon[i]!=INF && !dfn[i])tarjan(i);//tarjan记录强连通分量数,及每个强连通分量的smonfor(int i=1;i<=n;i++){for(int j=head[i];j;j=t[j].nex){if(belong[i]!=belong[t[j].to])rd[belong[t[j].to]]++;//统计每个强连通分量的入度 (找入度为0的点)
        }}int ans=0;for(int i=1;i<=n;i++)if(belong[i]==i && !rd[i])ans+=smon[i];//入度为0的点,即为连通块的起点,且smon已经被更新,直接加入答案 printf("YES\n%d",ans);//输出
return 0;
}

其实也没有想象中的那么暴力,手写栈+inline后,最慢的一个点都只用了4ms。

转载于:https://www.cnblogs.com/lck-lck/p/9630592.html

P1262 间谍网络相关推荐

  1. 洛谷P1262 间谍网络题解

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

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

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

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

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

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

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

  5. 洛谷P1262 间谍网络

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

  6. loj #10095 P1262 间谍网络

    analysis 首先将题面简化,问题就成为:给一个有向图,有一些特殊点有权值,其他点都没有权值,选取特殊点中的一部分使得其权值和最小且其与其相连的点构成的集合等价于所有点构成的集合(语文差,没办法) ...

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

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

  8. loj10095 间谍网络

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

  9. P1262_美帝的间谍网络被我部捕获!

    题面 这道题太神了吧,从昨晚七点半做到今天下午两点. 我经历了以下折腾(以下内容可跳过): 一开始想的是用Tarjan缩点,然后以可以被收买的间谍为起点跑最短路,通过路径染色,让一条路径上的点的权值等 ...

最新文章

  1. mysql 2014_mysql错误之2014
  2. 阿里代码规范插件 中文使用手册 FOR Eclipse
  3. 【Git笔记3】关于撤销、删除、恢复的那些事儿
  4. 更新json文件_忽略packagelock.json?
  5. 第十一节:WebApi的版本管理的几种方式
  6. 343. 整数拆分(JavaScript)
  7. 更新pip版本的方法
  8. netkeeper显示651_关于电信Netkeeper客户端升级的通知
  9. windows无法连接到打印机_电脑、打印机常见故障处理
  10. iOS 模拟器安装APP,在电脑上运行ios的app
  11. 小酷智慧地图3D导览v1.0.84 打卡定位 地图打卡
  12. wx小程序笔记(2)
  13. tsp java_蚁群算法java实现以及TSP问题蚁群算法求解
  14. mulesoft MCIA 破釜沉舟备考 2023.04.29.27 (易错题)
  15. 步进电机在音乐喷泉中的应用解决方案
  16. 支付宝支付沙箱 支付存在钓鱼风险解决方法
  17. 喜欢纪念碑谷的你,绝不能错过它灵感之一的《FEZ》
  18. CAD图块编辑:CAD软件中如何任意屏蔽图块?
  19. 26岁出纳挪用2570万元公款炒黄金
  20. 故障:电脑开机后显示屏黑屏

热门文章

  1. matlab vision hdl,MATLAB下载,MATLAB购买,MATLAB试用,MATLAB介绍,MATLAB评价
  2. xshell停止运行脚本_Xshell无法启动:要继续使用此程序,您必须应用最新的更新或使用新版本...
  3. linux中求当前时间gettime,linux – 你如何在shell中获得clock_gettime(2)时钟?
  4. mysql less2,实测Aurora Serverless MySQL
  5. fileservice 类代码放哪里_一步步开发Windows服务(Windows Service)[转]
  6. python逐行输出_python逐行输出
  7. ll文件显示为?????_关于shell编程中的文件测试简单的操作实例
  8. 索引多维数组_PHP数组–索引,关联和多维
  9. 我要自学编程,Java和C语言相比哪个好?
  10. 自制微信小程序通讯JS