http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=158#problem/F

大致题意:给出n个人和m种关系(ti,si),表示ti的年龄不小于si。问最小能被划分为几个集合。每一个集合都要满足里面的人都无法比較。



思路:对于一条路上的点。它们必然不能被划分到同一个集合中,因此原题变为求一条最长路。

而题目中有可能出现环。因此,先tarjan缩点转化为DAG,而缩点后的每一个点的点权便是该节点中包括的点的个数。然后记忆化求最长路。

PS:该题与上一篇 

uva 11324 The
Largest Clique
是一样的。该题重在转化。



#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#define LL long long
#define _LL __int64
#define eps 1e-8
#define PI acos(-1.0)
using namespace std; const int INF = 0x3f3f3f3f;
const int maxn = 100010; vector <int> edge[maxn],edge2[maxn];
int n,m;
int dfn[maxn],low[maxn],instack[maxn],dep,scc;
stack <int> st;
int set[maxn],num[maxn];
int d[maxn]; void init()
{
for(int i = 1; i <= n; i++)
{
edge[i].clear();
edge2[i].clear();
}
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(instack,0,sizeof(instack));
while(!st.empty()) st.pop(); dep = 0;
scc = 0;
memset(num,0,sizeof(num));
memset(d,0,sizeof(d));
} void tarjan(int u)
{
dfn[u] = low[u] = ++dep;
instack[u] = 1;
st.push(u); for(int i = 0; i < (int)edge[u].size(); i++)
{
int v = edge[u][i];
if(!dfn[v])
{
tarjan(v);
low[u] = min(low[u],low[v]);
}
else if(instack[v])
low[u] = min(low[u],dfn[v]);
}
if(dfn[u] == low[u])
{
scc++;
int t;
while(1)
{
t = st.top();
st.pop();
instack[t] = 0;
set[t] = scc;
num[scc]++;
if(t == u)
break;
}
}
} void creat()
{
for(int u = 1; u <= n; u++)
{
for(int i = 0; i < (int)edge[u].size(); i++)
{
int v = edge[u][i];
if(set[u] != set[v])
edge2[set[u]].push_back(set[v]);
}
}
} int dp(int u)
{
if(d[u]) return d[u];
else if(edge2[u].size() == 0) return d[u] = num[u]; int ans = 0;
for(int i = 0; i < (int)edge2[u].size(); i++)
{
int v = edge2[u][i];
ans = max(ans,dp(v));
}
return d[u] = ans+num[u];
} int main()
{
int u,v;
while(~scanf("%d %d",&n,&m))
{
init();
for(int i = 1; i <= m; i++)
{
scanf("%d %d",&u,&v);
edge[u].push_back(v);
}
for(int i = 1; i <= n; i++)
if(!dfn[i])
tarjan(i); creat(); int ans = 0;
for(int i = 1; i <= scc; i++)
{
ans = max(ans,dp(i));
}
printf("%d\n",ans);
}
return 0;
}



训练赛 Grouping(强连通分量缩点 + DAG求最长路)的更多相关文章

  1. 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路

    题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...

  2. uva 11324 The Largest Clique(强连通分量缩点+DAG动态规划)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=sh ...

  3. BZOJ 1924 所驼门王的宝藏(强连通分量缩点+DAG最长链)

    思路不是很难,因为宝藏只会在给出的n个点内有,于是只需要在这n个点里面连边,一个点如果能到达另一个点则连一条有向边, 这样用强连通分量缩点后答案就是DAG的最长链. 问题在于暴力建图是O(n^2)的, ...

  4. UVA 10029 Edit Step Ladders ——(DAG求最长路)

    题意:升序的给出一本若干个单词,每个单词都可删除一个字母,添加一个字母或者改变一个字母,如果任意一个操作以后能变成另外一个字典中的单词,那么就连一条有向边,求最长的长度. 分析:DAG的最长路和最短路 ...

  5. UVA 11324 The Largest Clique(强连通分量+缩点DAG的DP)

    题意:给定一个有向图,求出一个最大的结点集,这个节点集中的随意两个点之间至少一个能到达还有一个点. 思路:假设一个点在这个节点集中,那么它所在的强连通分量中的点一定所有在这个节点集中,反之亦然, 求出 ...

  6. 【强联通分量缩点】【最长路】【spfa】CH Round #59 - OrzCC杯NOIP模拟赛day1 队爷的讲学计划

    10分算法:对于城市网络为一条单向链的数据, 20分算法:对于n<=20的数据,暴力搜出所有的可能路径. 结合以上可以得到30分. 60分算法:分析题意可得使者会带着去的城市也就是这个城市所在强 ...

  7. LG2272/BZOJ1093 「ZJOI2007」最大半连通子图 Tarjan缩点+DAG求最长链

    问题描述 LG2272 BZOJ1093 题解 观察半联通的定义,发现图中的一些结点,构成的链一定是一个半联通子图. 此时存在的环可能会干扰求解,于是\(\mathrm{Tarjan}\)缩点. 于是 ...

  8. POJ 3592--Instantaneous Transference【SCC缩点新建图 &amp;&amp; SPFA求最长路 &amp;&amp; 经典】

    Instantaneous Transference Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6177   Accep ...

  9. 训练指南 UVALive - 4287 (强连通分量+缩点)

    layout: post title: 训练指南 UVALive - 4287 (强连通分量+缩点) author: "luowentaoaa" catalog: true mat ...

随机推荐

  1. js获取当前日期,网页头部用

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  2. 【状态DP】 HDU 1074 Doing Homework

    原题直通车:HDU  1074  Doing Homework 题意:有n门功课需要完成,每一门功课都有时间期限t.完成需要的时间d,如果完成的时间走出时间限制,就会被减 (d-t)个学分.问:按怎样 ...

  3. 【分享】深入浅出WPF全系列教程及源码

    本人10月份提出离职,可是交接非常慢,预计年底才会交接完,趁着交接之际,自学了一下WPF,由于这是微软未来的发展趋势,自WIN7以来包含前不久公布的WIN8,核心还是WPF,在此,将自己的学习成果做一 ...

  4. badi增强

    对于根据事务代码查找对应的BADI,网上介绍的方法很多,但总结下来无非就两种方法,在此把它记录下来,方便以后自己查阅了. (1)通过SE24,输入CL_EXITHANDLER,然后在方法GET_INS ...

  5. C#实现栈

    概述 先用C#实现一个栈的类,如下: public class MyStack<T> : IEnumerable<T>, IDisposable { ; ; private T ...

  6. 模板的Traits

    Traits含义就是特性,应用Trait模板参数,使得我们的程序既保持灵活性,同时减少类型参数的数量.能够使得我们对函数进行更加细粒度的控制. #ifndef TRAIT_H_ #define TRA ...

  7. ThinkPHP分页使用例子(二十一)

    原文:ThinkPHP分页使用例子(二十一) ThinkPHP分页使用 PHP代码: public function fenye(){ $User = M('Leyangjun'); // 实例化Us ...

  8. 深入 CSocket 编程之阻塞和非阻塞模式

    有时,花上几个小时阅读.调试.跟踪优秀的源码程序,能够更快地掌握某些技术关键点和精髓.当然,前提是对这些技术大致上有一个了解. 我通过几个采用 CSocket 类编写并基于 Client/Server ...

  9. Python性能分析指南 - 技术翻译 - 开源中国社区

    http://www.oschina.net/translate/python-performance-analysis

  10. 创建android画笔程序的样例(有镜面效果)

    先上图: 关键是在检測到手指移动的时候用mPath.quadTo的方法,android sdk解释是: Add a quadratic bezier from the last point, appr ...