【Tarjan】缩点

在一个点N数据极大的图中,直接SPFA或者记忆花搜索时间超限,那么我们可以利用Tarjan缩点来减少N。
举个例子;

如上图:3,6两点为该图中的强连通分量,我们可以将它们看做一个单元点。

怎么缩点呢

我们使用fa[]数组来存每个点所在的强连通分量中时间戳(DFN)最小的点,即将该点设为单元点。

怎么连边

如果两个点的fa[]不一样,且该两点间有一条有向边,那么我们就把他们的单元点(即fa[])连一条边

问题的求解

缩点后,重新建图,我们先找出图中入度为0的点,使用SPFA或拓扑排序来求解问题,与最短路问题相似

P3387 【模板】缩点

代码如下:

#include<bits/stdc++.h>
using namespace std;
struct edge{int nw,nxt,mark;
}pre[100010];
int n,m,idx,cnt;
int dfn[10010],low[10010];
int in[10010],v[10010],fa[10010];
int head[10010];
bool used[10010];
int stk[10010],p;
int ans=0;
void add (int x,int y,int cnt)
{pre[cnt].nw=x;pre[cnt].mark=head[x];pre[cnt].nxt=y;head[x]=cnt;
}
void tarjan (int u)
{dfn[u]=low[u]=++idx;stk[++p]=u;used[u]=1;for (int i=head[u];i!=0;i=pre[i].mark){int nx=pre[i].nxt;if (!dfn[nx]){tarjan (nx);low[u]=min (low[u],low[nx]);}else if (used[nx])low[u]=min (low[u],dfn[nx]);}if (low[u]==dfn[u]){do{v[u]+=v[stk[p]];fa[stk[p]]=u;used[stk[p]]=0;p--;}while (stk[p+1]!=u);v[u]>>=1;}
}
int topo ()
{int dis[10010];queue<int>q;for (int i=1;i<=n;i++)if (fa[i]==i){dis[i]=v[i];if (!in[i])q.push(i);}while (!q.empty()){int Now=q.front();for (int i=head[Now];i!=0;i=pre[i].mark){int Nxt=pre[i].nxt;dis[Nxt]=max (dis[Nxt],dis[Now]+v[Nxt]);in[Nxt]--;if (!in[Nxt])q.push (Nxt);}q.pop();}int maxx=0;for (int i=1;i<=n;i++)if (fa[i]==i)maxx=max (maxx,dis[i]);return maxx;
}
int main()
{memset (in,0,sizeof (in));memset (used,0,sizeof (used));memset (dfn,0,sizeof(dfn));memset (head,0,sizeof (head));scanf ("%d%d",&n,&m);for (int i=1;i<=n;i++)scanf ("%d",&v[i]);for (int i=1;i<=m;i++){int a,b;scanf ("%d%d",&a,&b);add (a,b,i);}for (int i=1;i<=n;i++)if (!dfn[i])tarjan (i);memset (head,0,sizeof (head));for (int i=1;i<=m;i++){int Now=fa[pre[i].nw];int Nxt=fa[pre[i].nxt];if (Now!=Nxt){add (Now,Nxt,++cnt);in[Nxt]++;}}printf ("%d",topo ());return 0;
}

转载于:https://www.cnblogs.com/PaulShi/p/10056836.html

【图论】Tarjan 缩点相关推荐

  1. P2002 消息扩散(图论 Tarjan缩点)

    原题链接:消息扩散 - 洛谷  写在前面:缩点是对于有向图的 思路:想一下就能发现,其实就是要找到有多少个入度为0的点,以它们为消息源得到的结果是最小的.但是有两个问题:有环.重边.有环->缩点 ...

  2. BZOJ 1051 受欢迎的牛(Tarjan缩点)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4573  Solved: 2428 [Submit][S ...

  3. bzoj1051 [HAOI2006]受欢迎的牛 tarjan缩点

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢"是可以传递的--如果A喜 欢B,B喜 ...

  4. 洛谷P4742(tarjan缩点+拓扑DP)

    https://www.luogu.org/problemnew/show/P4742 题目背景 [Night - 20:02[Night−20:02 P.M.]P.M.] 夜空真美啊--但是--快要 ...

  5. 【计蒜客 - 程序设计竞赛】商业信息共享(Tarjan缩点)

    题干: 商业信息共享 有 N 个公司,从每个公司都能单向地向另外一个公司分享最新商业信息,因为他们之间有着某种合作,你需要解决两个问题: 现在有一个最新的商业信息,至少需要告诉多少个公司,使得所有的公 ...

  6. 【POJ - 2186】Popular Cows (Tarjan缩点)

    题干: Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= ...

  7. 【BZOJ1179】atm,tarjan缩点+最长路径

    Time:2016.05.21 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 题目中是一个带点权的有向图,如果这是一个没有环的图那么问题就很简单,拓扑或者直接求最长(短)路径什么的 ...

  8. 【BZOJ1051】受欢迎的牛,tarjan缩点重构图

    Time:2016.05.18 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: (自己不必认为自己受欢迎) tarjan缩点然后重构图 一个强连通分量里肯定是相互认为受欢迎的 重构图 ...

  9. 浅谈Tarjan缩点(分析+模板)

    昨天一看发现我的博客数量到100篇了,撒花✿✿ヽ(°▽°)ノ✿ 根据标题我们也知道,想要在接下来的十分钟不浪费生命 读者需要先行学习Tarjan强联通分量 如果不会的话可以点击这里:https://w ...

最新文章

  1. 应对全球粮食危机 AI、5G与机器视觉联手“养鱼”
  2. Sharepoint client model 中出现Cannot invoke HTTP DAV request. There is a pending query 的解决办法...
  3. Siamese Neural Networks for One-shot Image Recognition
  4. 学成在线--13.RabbitMQ工作模式
  5. 消息队列 ActiveMQ 、RocketMQ 、RabbitMQ 和 Kafka 如何选择?
  6. php页面的特点_带你一分钟了解php的四大特性八大优势(详情)
  7. 删除重复记录10.22
  8. 【图像分割】基于matlab GUI遗传算法Otsu图像分割【含Matlab源码 734期】
  9. 如何使用C#编写用友U8软件相关功能,适用于插件和二次开发
  10. 如何使用移动端后台管理数据
  11. photoshop中魔棒工具的使用
  12. WinCC界面中通过插件打开pdf文件
  13. Leetcode 50. Pow(x, n)碰到的一些问题
  14. 昔日的手游大作,《无尽之剑》系列如今为何走向英雄末路?
  15. 微信小程序前端备忘录记事本搜索功能
  16. 11 | 向埃隆·马斯克学习任务分解
  17. (8)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接3
  18. #include ““和#include <>区别
  19. opencv学习笔记三十六:AKAZE特征点检测与匹配
  20. 实战详解Maven部署(deploy)jar到私有仓库Nexus及如何引入私仓jar包

热门文章

  1. Go gin参数绑定
  2. Scala Collection体系介绍
  3. 【收藏】在QGIS中导入GOOGLE、BING等地图和卫星影像(插件方式和XYZ方式)
  4. 利用神器BTrace 追踪线上 Spring Boot应用运行时信息
  5. Python Django URL逆向解析(通过Python代码逆向访问)代码示例
  6. 【软考-软件设计师】计算机存储器的分类
  7. 【报表技术】IReport 图形化报表开发工具安装教程
  8. Mac终端 bash和zsh切换方法
  9. 安卓系列转载,有时间可以参考学习
  10. windows10 下 用图片手把手教你 卸载 cygwin