2014 Super Training #8 G Grouping --Tarjan求强连通分量
原题:ZOJ 3795 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3795
题目大意:给定一个有向图,要求把点分为k个集合,使得每个集合中的任意两点a, b满足a, b互相不可到达。
分析:求出强连通分量后缩点,得到有向无环图,dfs该图求出各点深度(深度加权,权值为强连通分量大小),深度最大值即答案,
因为这一条路径上任意两点都可从深度小的一点到达深度大的一点,所以任意两点必定属于不同集合,即每个点一个集合;求的最大深度集合后,又可以把其它路径(长度为len)上的各点依次归到集合1..len。
代码:
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- #include <vector>
- #include <queue>
- #include <stack>
- #define Mod 1000000009
- using namespace std;
- #define N 100007
- vector<int> G[N],G2[N];
- stack<int> stk;
- int instk[N],cnt,Time,n,m,dep[N];
- int low[N],dfn[N],bel[N],num[N];
- void tarjan(int u)
- {
- low[u] = dfn[u] = ++Time;
- stk.push(u);
- instk[u] = ;
- for(int i=;i<G[u].size();i++)
- {
- int v = G[u][i];
- if(!dfn[v])
- {
- tarjan(v);
- low[u] = min(low[u],low[v]);
- }
- else if(instk[v])
- low[u] = min(low[u],dfn[v]);
- }
- if(low[u] == dfn[u])
- {
- cnt++;
- int v;
- do
- {
- v = stk.top();
- stk.pop();
- instk[v] = ;
- bel[v] = cnt;
- num[cnt]++;
- }while(u != v);
- }
- }
- void Tarjan()
- {
- memset(bel,,sizeof(bel));
- memset(instk,,sizeof(instk));
- memset(dfn,,sizeof(dfn));
- memset(low,,sizeof(low));
- memset(num,,sizeof(num));
- Time = cnt = ;
- while(!stk.empty())
- stk.pop();
- for(int i=;i<=n;i++)
- if(!dfn[i])
- tarjan(i);
- }
- void Build()
- {
- int i,j;
- for(i=;i<=cnt;i++)
- G2[i].clear();
- for(i=;i<=n;i++)
- {
- for(j=;j<G[i].size();j++)
- {
- int v = G[i][j];
- if(bel[i] != bel[v])
- G2[bel[i]].push_back(bel[v]);
- }
- }
- }
- int dfs(int u)
- {
- if(dep[u])
- return dep[u];
- for(int i=;i<G2[u].size();i++)
- {
- int v = G2[u][i];
- dep[u] = max(dep[u],dfs(v));
- }
- dep[u] += num[u];
- return dep[u];
- }
- int main()
- {
- int i,j,u,v;
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- for(i=;i<=n;i++)
- G[i].clear();
- for(i=;i<m;i++)
- {
- scanf("%d%d",&u,&v);
- G[u].push_back(v);
- }
- Tarjan();
- Build();
- memset(dep,,sizeof(dep));
- int res = ;
- for(i=;i<=n;i++)
- res = max(res,dfs(i));
- printf("%d\n",res);
- }
- return ;
- }
2014 Super Training #8 G Grouping --Tarjan求强连通分量的更多相关文章
- UESTC 901 方老师抢银行 --Tarjan求强连通分量
思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...
- tarjan求强连通分量+缩点+割点以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题
Summer Holiday Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】
Road Networks Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Stat ...
- Tarjan求强连通分量,缩点,割点
Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...
- CCF 高速公路 tarjan求强连通分量
问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...
- tarjan求强连通分量(模板)
https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...
- Tarjan求强连通分量、求桥和割点模板
Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...
随机推荐
- maven oracle jdbc jar
1.problem describe: when your dependency jar about oracle use code like this: <!-- oracle-connect ...
- 使用Apache ab进行压力测试(参数说明)
我们一般会使用Apache自带的ab来对项目进行压力测试,看项目的执行情况如何. 我们可以使用 ab -v 来查看ab的详细参数使用方法. [root@node234 bin]# ./ab -v ab ...
- java调用html模板发送html内容的邮件
在项目需要发送邮件,普通内容的邮件觉得太单调.太丑,没逼格,所以说直接把用到的邮件内容做成一个html模板,发送之前将对应参数替换掉,发送html内容的高逼格邮件. 首先需要引用jar包,这就不多说了 ...
- 再议使用Python批量裁切栅格
曾经写过<使用Python脚本批量裁切栅格>,但今天又遇到这个情况则发现了问题.我们遇到的实际问题往往是有一个需要裁剪的影像(大块的),另外有一个矢量面,现在需要按矢量面每一个要素进行裁剪 ...
- Button 对 TreeView1 所有节点的全选
protected void Button1_Click(object sender, EventArgs e) { for (int i = 0; i < this.Tre ...
- mysql innoDB 挂了的临时解决方案
Mysql InnoDB: Error: checksum mismatch by Mattias Hemmingsson on December 23, 2013 in Linux • 6 Comm ...
- Java使用正则表达式获取文本的章节名称
获取文本的章节,首先要确定章节的开始标准,一般中文的章节都是以“第”开头,第一章.第二章等.所以使用“^”字符来确定首位,但是很多时候章节前面会有空白字符,所有以“第”作为章节的开始,进行以下的匹配 ...
- UITableView删除添加和移动
#import "RootTableViewController.h" @interface RootTableViewController () @property (nonat ...
- Android官方多媒体API Mediacodec翻译(一)
因近期工作调整,关于Mediacodec部分的翻译会暂停,后续有时间一定补上,非常抱歉. 本文章为根据Android Mediacodec官方英文版的原创翻译,转载请注明出处:http://www.c ...
- iOS 中 CAShapeLayer 的使用( 等待删除的博文)
等待删除. 1.CAShapeLayer 简介 1.CAShapeLayer继承至CALayer,可以使用CALayer的所有属性值 2.CAShapeLayer需要与贝塞尔曲线配合使用才有意义 3. ...