怕自己太久没写Tarjan了就会把这种神仙算法忘掉。

其实这种类型的图论题的套路还是比较简单且显然的。

P2002 消息扩散

很显然的题目,因为在一个环(其实就是强连通分量)中的城市都只需要让其中一个知道就可以让其它的城市都得知信息了。

因此我们把在一个强连通分量中的点都缩点,然后就得到一个DAG

然后我们只需要给入度为0的点传递信息即可

CODE

#include<cstdio>
#include<cstring>
using namespace std;
const int N=100005;
struct edge
{
int to,next;
}e[N*5];
int head[N],col[N],ru[N],dfn[N],low[N],stack[N],n,m,x,y,cnt,tot,top,sum,ans;
bool vis[N];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline void add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline void Tarjan(int now)
{
dfn[now]=low[now]=++tot; stack[++top]=now; vis[now]=1;
for (register int i=head[now];i^-1;i=e[i].next)
if (!dfn[e[i].to])
{
Tarjan(e[i].to);
low[now]=min(low[now],low[e[i].to]);
} else if (vis[e[i].to]) low[now]=min(low[now],dfn[e[i].to]);
if (!(low[now]^dfn[now]))
{
col[now]=++sum; vis[now]=0;
while (stack[top]!=now)
{
col[stack[top]]=sum; vis[stack[top--]]=0;
} --top;
}
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
memset(head,-1,sizeof(head));
memset(e,-1,sizeof(e));
register int i,j; read(n); read(m);
for (i=1;i<=m;++i)
read(x),read(y),add(x,y);
for (i=1;i<=n;++i)
if (!dfn[i]) Tarjan(i);
for (i=1;i<=n;++i)
for (j=head[i];j^-1;j=e[j].next)
if (col[i]^col[e[j].to]) ++ru[col[e[j].to]];
for (i=1;i<=sum;++i)
if (!ru[i]) ++ans;
printf("%d",ans);
return 0;
}

P1262 间谍网络

这个的话读一下题目就可以发现这是前一题的加权版

然后对于一个强连通分量中的点,在缩点后的权值应该是多少呢。

很显然,肯定找最便宜的人贿赂吗!

所以我们上一题的操作之上加权然后还是找入度为0的点。

不过注意下如果一个点的入度为0但是这个间谍无法被贿赂那么就无法被控制

CODE

#include<cstdio>
#include<cstring>
using namespace std;
const int N=3005,M=8005;
struct edge
{
int to,next;
}e[M];
int head[N],col[N],ru[N],dfn[N],low[N],stack[N],a[N],s[N],num[N],n,m,x,y,cnt,tot,top,sum,ans,INF,p;
bool vis[N];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline void add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline void Tarjan(int now)
{
dfn[now]=low[now]=++tot; stack[++top]=now; vis[now]=1;
for (register int i=head[now];i^-1;i=e[i].next)
if (!dfn[e[i].to])
{
Tarjan(e[i].to);
low[now]=min(low[now],low[e[i].to]);
} else if (vis[e[i].to]) low[now]=min(low[now],dfn[e[i].to]);
if (!(low[now]^dfn[now]))
{
col[now]=++sum; s[sum]=a[now]; num[sum]=now; vis[now]=0;
while (stack[top]!=now)
{
col[stack[top]]=sum; vis[stack[top]]=0;
s[sum]=min(s[sum],a[stack[top--]]);
} --top;
}
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
memset(head,-1,sizeof(head));
memset(e,-1,sizeof(e));
memset(a,127,sizeof(a)); INF=a[0];
register int i,j; read(n); read(p);
for (i=1;i<=p;++i)
read(x),read(y),a[x]=y;
for (read(m),i=1;i<=m;++i)
read(x),read(y),add(x,y);
for (i=1;i<=n;++i)
if (!dfn[i]) Tarjan(i);
for (i=1;i<=n;++i)
for (j=head[i];j^-1;j=e[j].next)
if (col[i]^col[e[j].to]) ++ru[col[e[j].to]];
for (i=1;i<=sum;++i)
if (!ru[i])
{
if (!(s[i]^INF)) { printf("NO\n%d",num[i]); return 0; }
ans+=s[i];
}
printf("YES\n%d",ans);
return 0;
}

Luogu P2002 消息扩散&&P1262 间谍网络的更多相关文章

  1. 【luogu P2002 消息扩散】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2002 缩点把原图变为DAG,再在DAG上判断找入度为0的点的个数. 注意一点出度为0的点的个数不等于入度为0 ...

  2. LuoGu P2002 消息扩散

    题目传送门 这个题其实就是tarjan缩点的板子题对吧....至少我是这么想的 首先这是个有向图,对于一个有向图,我们肯定要考虑环的存在与否,恰好这个题又是让我们找出最少的点,使得这几个点能够走遍全图 ...

  3. 洛谷——P1262 间谍网络

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

  4. 洛谷—— P2002 消息扩散

    P2002 消息扩散 题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市 ...

  5. 【luogu P1262 间谍网络】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1262 注意: 1.缩点时计算出入度是在缩完点的图上用color计算.不要在原来的点上计算. 2.枚举出入度时 ...

  6. P1262 间谍网络

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

  7. 【题解】洛谷P1262 间谍网络 (强连通分量缩点)

    洛谷P1262:https://www.luogu.org/problemnew/show/P1262 思路 一看题目就知道是强连通分量缩点 当图中有强连通分量时 将其缩点 我们可以用dfn数组判断是 ...

  8. 洛谷 P1262 间谍网络==Codevs 4093 EZ的间谍网络

    4093 EZ的间谍网络 时间限制: 10 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B ...

  9. 洛谷 P1262 间谍网络 —— 缩点

    题目:https://www.luogu.org/problemnew/show/P1262 首先,一个强连通分量里有一个点被控制则所有点都被控制,所以先 tarjan 缩点,记一下每个连通块中能被收 ...

随机推荐

  1. CSS基本知识(慕课网)

    1.注释 注解:CSS中注释/*这里是注释的文字*/   HTML中注释<!--这里是注释的文字--> 2.外部式css样式,写在单独的一个文件中 注解: 外部式css样式(也可称为外联式 ...

  2. Jni OnLoad()和OnUnload()

    除了前面说的自定义JNI函数之外,JNI还提供了两个特殊函数,它们是JNI_OnLoad()和JNI_OnUnload(),分别在加载库和卸载库的时候调用. 1.JNI_OnLoad() Java调用 ...

  3. 前端路由简介以及vue-router实现原理

    后端路由简介 路由这个概念最先是后端出现的.在以前用模板引擎开发页面时,经常会看到这样 http://www.xxx.com/login 大致流程可以看成这样: 浏览器发出请求 服务器监听到80端口( ...

  4. 洗礼灵魂,修炼python(37)--面向对象编程(7)—了解魔法方法

    也许上一篇博文提到的property内置函数的用法你还觉得记忆犹新,那么有没有更多的类似的方法呢?有的,就是本篇文章要说的魔法方法 魔法方法 1.什么是魔法方法 (其实前面已经提到多次,每次我都是说暂 ...

  5. 【PAT】B1085 PAT单位排行(25 分)(c++实现)

    终于做的有点眉目了,今天学习了一点stl的皮毛,解题瞬间变容易了 下边开始分析本题 这道题如果用纯c解决实在太麻烦,试了半天两个超时,果断放弃,还是用map方便: 我的方法与柳神的方法是有区别的,我只 ...

  6. 如何在Windows上挂载Linux系统分区

    NFS普遍用于unix之间共享,windows默认是不支持这种文件系统的.如果我们要用windows访问NFS的话,而windows系统自身又不支持这种文件系统,那么我们该怎么办? 别急,小编这就手把 ...

  7. 12个HTML和CSS必须知道的重点难点问题

    这12个问题,基本上就是HTML和CSS基础中的重点个难点了,也是必须要弄清楚的基本问题,其中定位的绝对定位和相对定位到底相对什么定位?这个还是容易被忽视的,浮动也是一个大坑,有很多细节.这12个知识 ...

  8. [项目实践] python文件路径引用的规则,记一次使用sys.path[0]的问题,及如何区分 ../与 ./的使用场景

    下面是一个获取配置的代码 def getValue(self,section,option): """ @file: string,the name of the con ...

  9. sysctl命令

    sysctl命令作用: 被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中,它包含一些TCP/ip堆栈和虚拟内存系统的高级选项,用sysctl可以读取设置超过五百个系 ...

  10. Spring Boot属性配置文件详解

    相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...