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. OSGi:生命周期层

    前言 生命周期层在OSGi框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或者两者的结合),并且给了应用本 ...

  2. 静态书架和js模拟翻书效果

    书籍图片随便找了个,有点难看,须要的自己替换个好看点的png格式图片 源代码下载:http://download.csdn.net/detail/sweetsuzyhyf/7604091

  3. Cocos2dx中Plugin-X 在android下的整合

    直接拉plugin-x中的jar包导入到Eclipse中就可以.用这么麻烦的工具干嘛.

  4. MFC-消息分派

    前言 由于工作需要,这几天学了一点MFC,在AFX里看到很多熟悉的东西,如类型信息,序列化,窗口封装和消息分派.几乎每个界面库都必须提供这些基础服务,但提供的手法却千差万别.MFC大量地借用了宏,映射 ...

  5. maven的pom 提示错误 Failure to transfer com.thoughtworks.xstream:xstream:jar:

    pom文件提示错误,信息如下 Description    Resource    Path    Location    TypeFailure to transfer com.thoughtwor ...

  6. eclipse如何查看类之间的引用关系

    今天遇到这个问题:mark一点点: 在类名上单击右键.选择Reference->Workingspace快捷克债券Ctrl+Shift+G 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  7. php 上传文件 $_FILES['']['type']的值

    php 上传文件 $_FILES['']['type']的值 一个函数 function upload_file($fname,$ftype,$fsize,$ferror,$ftmp_name,$fp ...

  8. Citrix 服务器虚拟化之三十一 XenApp 6.5负载均衡

    Citrix 服务器虚拟化之三十一 XenApp 6.5负载均衡 说明:       环境基于实验三十 1.准备一台Windows Server 2008 R2的虚拟机名为XenAPP2,然后加入域k ...

  9. 以JTextPanel为例Swing的鼠标事件详解

    如下界面可以通过该界面研究一下Swing的鼠标事件: 图中用红粗线圈起来的为JtextPanel,该Panel添加了鼠标事件监听器,鼠标事件监听器有三种,分别为MouseWheelListener,M ...

  10. Docker 用法总结之:管理工具 shipyard 的具体使用指南

    Docker 的命令行就已经非常好用了,假设非要加上基于 Web 的管理界面的话也有一些选择,如 DockerUI (Angular.js), Dockland (Ruby), Shipyard (P ...