P1262 间谍网络
思路:
①在 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=,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=;
char ls;
for(;ls>''||ls<'';kr=ls,ls=getchar());
int xs=;
for(;ls>=''&&ls<='';ls=getchar())
{
xs=xs*+ls-;
}
if(kr=='-') xs=-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+]!=u);
}
}
int main()
{
n=read();m=read();
for(int i=;i<=n;i++)
mon[i]=INF;//不受贿的间谍设为一个极大值
for(int i=;i<=m;i++)
{
int x,y;
x=read();y=read();
mon[x]=y;//读入受贿间谍要的钱
}
m=read();
for(int i=;i<=m;i++)
{
int x,y;
x=read();y=read();
add(x,y);//加边存图
}
for(int i=;i<=n;i++)
if(mon[i]!=INF)
dfs(i);//遍历全图,确定是否有间谍不愿被收买
for(int i=;i<=n;i++)
{
if(!vis[i])//找到那个不愿被收买的间谍
{
printf("NO\n%d",i);
return ;//直接结束程序
}
}
tot=;
for(int i=;i<=n;i++)
vis[i]=;//初始化vis
for(int i=;i<=n;i++)
if(mon[i]!=INF && !dfn[i])
tarjan(i);//tarjan记录强连通分量数,及每个强连通分量的smon
for(int i=;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=;
for(int i=;i<=n;i++)
if(belong[i]==i && !rd[i])
ans+=smon[i];//入度为0的点,即为连通块的起点,且smon已经被更新,直接加入答案
printf("YES\n%d",ans);//输出
return ;
}
其实也没有想象中的那么暴力,手写栈+inline后,最慢的一个点都只用了4ms。
P1262 间谍网络的更多相关文章
- Luogu P2002 消息扩散&&P1262 间谍网络
怕自己太久没写Tarjan了就会把这种神仙算法忘掉. 其实这种类型的图论题的套路还是比较简单且显然的. P2002 消息扩散 很显然的题目,因为在一个环(其实就是强连通分量)中的城市都只需要让其中一个 ...
- 洛谷——P1262 间谍网络
P1262 间谍网络 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意 ...
- 洛谷 P1262 间谍网络==Codevs 4093 EZ的间谍网络
4093 EZ的间谍网络 时间限制: 10 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B ...
- 洛谷P1262 间谍网络[强连通分量 BFS]
题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...
- 洛谷 P1262 间谍网络 Label: Kosarajn强联通
题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...
- 洛谷P1262 间谍网络
本来只想刷道小题,没想到还有点麻烦 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美 ...
- 洛谷P1262间谍网络
题目 我们首先考虑该题没有环应该怎么做,因为没有环所以是一个DAG,因此直接加上入度为0的罪犯,而有环则可以缩点,之后就成为了DAG,然后用一方法做就好了. \(Code\) #include < ...
- P1262 间谍网络 (tarjan缩点 水过去)
题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...
- luogu P1262 间谍网络
嘟嘟嘟 建图还是很明显的. 接着分两种情况: 1.图中不存在环:那么只要收买那些入度为0的点.如果这些点有的不能收买.就不能控制所有间谍. 2.图中存在环,那么对于这些在环中的点,我们只要收买数额最少 ...
随机推荐
- HTML(续)
1.有frame就无body,框架的noresize:设置框架大小不能改变.2.链接在框架中的应用target:有定为目标的功能.<a href = "链接源地址" targ ...
- 论文翻译——Rapid 2D-to-3D conversion——快速2D到3D转换
https://blog.csdn.net/qq_33445835/article/details/80143598 目前想做一个关于2D转3D的项目,由于国内资料比较少而且大部分都是基于国外的研究 ...
- LSTM算法原理理解
神经网络 模拟人类大脑神经网络结构,每个神经元和其他的神经元相互连接,当它兴奋的时候会向相连的神经元发送化学物质,从而改变神经元的电位,当神经元的电位超过阈值,它会被激活,向其他神经元发送化学物质.其 ...
- DATAPUMP PERFORMANCE EXPDP IS VERY SLOW 10.2.0.4 TO 11.2.0.2
APPLIES TO: Oracle® Database - Enterprise Edition - Version 10.2.0.4 to 11.2.0.2 [Release 10.2 to 11 ...
- 【题解】Luogu P1533 可怜的狗狗
原题传送门 莫队介绍,Splay介绍 离线的题目,莫队是不错的解决方法 先把询问排一下序 剩下就套一个莫队的板子 每来一只狗就把漂亮值插入平衡树 每去掉一只狗就把漂亮值从平衡树中删掉 每次查询查平衡树 ...
- Linux基础笔记—— 走进Linux
走进Linux 操作系统 操作系统是计算机中必不可少的基础系统软件,他的作用是管理和控制计算机系统中的硬件和软件资源,合理有效的组织系统的工作流程,在计算机系统(硬件)与使用者之间提供接口作用. 操作 ...
- Selenium 15: How to Run Parallel Tests Using Selenium Grid and JUnit
In this post, I will give two techniques and describe how to run your selenium tests in parallel by ...
- python&django 常见问题及解决方法
0.python-dev安装(ubuntu) apt-get install python-dev 1.Open(filename,mode) 报错实例: f = open('d:\Users\16 ...
- Vue脚手架创建项目
创建一个基于webpack模板的新项目 D:\Git $ vue -V D:\Git $ vue init webpack my-project ? Project name my-project ? ...
- 【Finchley】【新特性】Spring Cloud Finchley 新特性
Finchley 正式版的发布貌似经历了相当长的时间,这次的重大发布主要带来了以下 4 项重大更新. 重大更新 1.新增 Spring Cloud Gateway 组件 Spring Cloud Ga ...