<题目链接>

题目大意:

给你一张有向图 G,求一个结点数最大的结点集,使得该结点集中的任意两个结点 u 和 v 满足:要么 u 可以达 v,要么 v 可以达 u(u,v相互可达也行)。

解题分析:

该点集需满足两个要求:1.任意两点至少有一方能够到达另外一点;2.点数尽可能的多。

通过画图分析可以知道,对于那些强连通分量来说,要不就全部加入该点集,要不就全部不能加入,所以直接对原图进行缩点,进行重新构图。然后,根据重新构造的DAG图我们可以知道,要使该点集中任意两点至少有一方能够到达另外一点,并且要求点数尽可能的多,可以发现,其实就是让我们求缩点后的最长路。

 #include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std; #define pb push_back
#define clr(a,b) memset(a,b,sizeof(a))
#define rep(i,s,t) for(int i=s;i<=t;i++)
const int N = 1e3+,M = 5e4+;
int n,m,tot,tott,top,scc;
int head[N],belong[N],dfn[N],low[N],stk[N],instk[N],dp[N],cnt[N];
vector<int>G[N];
struct Edge{
int to,next;
}edge[M];
void init(){
rep(i,,n)G[i].clear();
tot=scc=top=tott=;
clr(head,-);clr(low,);clr(dfn,);clr(stk,);clr(instk,);clr(belong,);clr(dp,);clr(cnt,);
}
void addedge(int u,int v){
edge[++tot].to=v,edge[tot].next=head[u];
head[u]=tot;
}
void Tarjan(int u){ //进行缩点
dfn[u]=low[u]=++tott;
stk[++top]=u;instk[u]=;
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to;
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}else if(instk[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
scc++;
while(true){
int v=stk[top--];
instk[v]=;
belong[v]=scc;
cnt[scc]++;
if(v==u)break;
}
}
}
//记忆化搜索求以u为起点的最长路,点权为"点"中点的个数
int DFS(int u){
if(dp[u])return dp[u];
int ans=cnt[u];
for(int i=;i<G[u].size();i++){
int v=G[u][i];
ans=max(ans,DFS(v)+cnt[u]);
}
return dp[u]=ans;
}
int main(){
int T;scanf("%d",&T);while(T--){
init();
scanf("%d%d",&n,&m);
rep(i,,m){
int u,v;scanf("%d%d",&u,&v);
addedge(u,v);
}
rep(i,,n)
if(!dfn[i])Tarjan(i);
//对图进行缩点,重新构图
rep(u,,n) for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to;
if(belong[u]!=belong[v])
G[belong[u]].pb(belong[v]);
}
int ans=;
rep(i,,scc)
ans=max(ans,DFS(i)); //求缩点后图的最长路
printf("%d\n",ans);
}
}

2018-11-28

UVA11324 The Largest Clique (强连通缩点+DP最长路)的更多相关文章

  1. ZOJ 3795 Grouping (强连通缩点+DP最长路)

    <题目链接> 题目大意: n个人,m条关系,每条关系a >= b,说明a,b之间是可比较的,如果还有b >= c,则说明b,c之间,a,c之间都是可以比较的.问至少需要多少个集 ...

  2. UVA - 11324 The Largest Clique (强连通缩点+dp)

    题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u. 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可. 感觉 ...

  3. UVA11324 The Largest Clique[强连通分量 缩点 DP]

    UVA - 11324 The Largest Clique 题意:求一个节点数最大的节点集,使任意两个节点至少从一个可以到另一个 同一个SCC要选一定全选 求SCC 缩点建一个新图得到一个DAG,直 ...

  4. uva11324 The Largest Clique --- 强连通+dp

    给一个有向图G,求一个子图要求当中随意两点至少有一边可达. 问这个子图中最多含多少个顶点. 首先找SCC缩点建图.每一个点的权值就是该点包括点的个数. 要求当中随意两点可达,实际上全部边仅仅能同方向, ...

  5. UVA - 11324 The Largest Clique 强连通缩点+记忆化dp

    题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...

  6. BZOJ 5450 轰炸 (强连通缩点+DAG最长路)

    <题目链接> 题目大意: 有n座城市,城市之间建立了m条有向的地下通道.你需要发起若干轮轰炸,每轮可以轰炸任意多个城市.但每次轰炸的城市中,不能存在两个不同的城市i,j满足可以通过地道从城 ...

  7. UVA11324 The Largest Clique —— 强连通分量 + 缩点 + DP

    题目链接:https://vjudge.net/problem/UVA-11324 题解: 题意:给出一张有向图,求一个结点数最大的结点集,使得任意两个结点u.v,要么u能到达v, 要么v能到达u(u ...

  8. 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路

    题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...

  9. Tarjan缩点+Spfa最长路【p3627】[APIO2009] 抢掠计划

    Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri ...

随机推荐

  1. PID控制器开发笔记之十一:专家PID控制器的实现

    前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部.再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是 ...

  2. 彻底完全卸载 SQL Server 2005 的图文教程

    彻底完全卸载 SQL Server 2005 的图文教程 SQL SERVER 2005不象SERVER 2000所有组件都汇总在一起,所以卸载时特别麻烦,如果不按正常的方法卸载,重新安装是不可能安装 ...

  3. Ehcache

    前言:设计一套缓存框架需要关注的要素 本文来源:RayChase  的<设计一套缓存框架需要关注的要素> 最近关注了一些缓存框架的特性和实现,包括OSCache.JCS.Ehcache.M ...

  4. 在 Linux 中自动启动 Confluence 6

    在 Linux/Solaris 环境下,最好的办法是对每一个服务进行安装和配置(包括 Confluence),同时配置这些服务权限为他们所在用户需要的服务权限即可, 为实例创建一个 Confluenc ...

  5. RefineDet算法笔记

    ---恢复内容开始--- 一.创新点 针对two-stage的速度慢以及one-stage精度不足提出的方法,refinedet 包括三个核心部分:使用TCB来转换ARM的特征,送入ODM中进行检测: ...

  6. CentOS7图形界面与命令行界面切换(转载)

    在图形界面使用 ctrl+alt+F2切换到dos界面 dos界面 ctrl+alt+F2切换回图形界面 在命令上 输入 init 3 命令 切换到dos界面 输入 init 5命令 切换到图形界面 ...

  7. LeetCode(95): 不同的二叉搜索树 II

    Medium! 题目描述: 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [   [1,null,3,2],   [3,2,null,1],   ...

  8. Client-Side Attacks

    1.之前看到中间人攻击方式,要使用ssl服务构架一个劫持会话,使得攻击者和被攻击者客户端连接.ssl 服务(secure Socket Layer安全套接) ,以及后续出现的TSL(Transport ...

  9. CF558E

    非常好的一道题,是线段树的常见玩法 将字符串转化为1~26个数 对区间开一棵线段树,用两个数组分别维护区间中1~26每个数的个数以及一个区间覆盖标记,表示这个区间是否被某一个值覆盖了 在每次排序时,首 ...

  10. 拓展中国剩余定理(ex_crt)

    一般来讲,crt(中国剩余定理)比较常见,而ex_crt(拓展中国剩余定理)不是很常用 但是noi 2018偏偏考了这么个诡异的东西... 所以这里写一个ex_crt模板 模型: 求一个x满足上述方程 ...