题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点
u,v, 都有u->v 或者 v->u 或者u<==>v

思路:首先将强连通分量通过tarjan算法求出来,然后进行缩点,也就是每一个缩点
所组成的图就是一个DAG图!令每一个点的权值就是这个缩点所包含节点(也就是对应的
强连通分量的节点数目),因为强连通分量的任意的两个节点都是相互可达的,那么这个
缩点要么选要么不选,问题就转换成了DAG图上的最长路径!

 #include<iostream>
#include<queue>
#include<stack>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define N 1005
using namespace std; struct EDGE{
int u, v, nt;
EDGE(){}
EDGE(int u, int v, int nt) : u(u), v(v), nt(nt){}
}; int first[N];
vector<EDGE>g;
vector<EDGE>gg;
int scc_cnt, dfs_clock;
int scc[N];
int pre[N], low[N];
int dp[N], cnt[N]; int in[N];
int n, m;
stack<int>s; void dfs(int u){
pre[u] = low[u] = ++dfs_clock;
s.push(u);
for(int i = first[u]; ~i; i = g[i].nt){
int v = g[i].v;
if(!pre[v]){
dfs(v);
low[u] = min(low[u], low[v]);
}else if(!scc[v])
low[u] = min(low[u], pre[v]);
}
if(low[u] == pre[u]){
++scc_cnt;
while(){
++cnt[scc_cnt];
int x = s.top(); s.pop();
scc[x] = scc_cnt;
if(x==u) break;
}
}
} void addEdge(int u, int v){
g.push_back(EDGE(u, v, first[u]));
first[u] = g.size() - ;
} void tarjans(){
memset(pre, , sizeof(pre));
memset(scc, , sizeof(scc));
memset(cnt, , sizeof(cnt));
memset(dp, , sizeof(dp));
memset(in, , sizeof(in));
scc_cnt = ;
dfs_clock = ;
for(int i=; i<=n; ++i)
if(!pre[i]) dfs(i);
int len = g.size();
memset(first, -, sizeof(first));
gg.clear();
for(int i=; i<len; ++i)
if(scc[g[i].u] != scc[g[i].v]){
in[scc[g[i].v]]++;
gg.push_back(EDGE(scc[g[i].u], scc[g[i].v], first[scc[g[i].u]]));
first[scc[g[i].u]] = gg.size() - ;
}
int maxN = ;
queue<int>q;
for(int i=; i<=scc_cnt; ++i)
if(!in[i]){
dp[i] = cnt[i];
q.push(i);
if(maxN < dp[i]) maxN = dp[i];
}
while(!q.empty()){
int u = q.front(); q.pop();
for(int i=first[u]; ~i; i = gg[i].nt){
int v = gg[i].v;
dp[v] = max(dp[v], dp[u] + cnt[v]);
q.push(v);
if(maxN < dp[v]) maxN = dp[v];
}
}
printf("%d\n", maxN);
} int main(){
int t;
scanf("%d", &t);
while(t--){
memset(first, -, sizeof(first));
scanf("%d%d", &n, &m);
while(m--){
int u, v;
scanf("%d%d", &u, &v);
addEdge(u, v);
}
tarjans();
g.clear();
}
return ;
}

UVAoj 11324 - The Largest Clique(tarjan + dp)的更多相关文章

  1. UVA 11324.The Largest Clique tarjan缩点+拓扑dp

    题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...

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

    UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...

  3. uva 11324 The Largest Clique(图论-tarjan,动态规划)

    Problem B: The Largest Clique Given a directed graph G, consider the following transformation. First ...

  4. uva 11324 The Largest Clique (Tarjan+记忆化)

    /*每个环 要么不选 要么全选 可缩点 就得到一个GAD图 然后搞搞算出最大路径*/ #include<iostream> #include<cstdio> #include& ...

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

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

  6. UVA 11324 The Largest Clique(缩点+DAG上的dp)

    求最大团.和等价性证明有类似之处,只不过这个不是求互推,而是只要a->b,或b->a即可. 同样的,容易想到先缩点,得到DAG,每个节点上保存SCC的点数,相信任意一条由根节点(入度为零) ...

  7. UVA 11324 The Largest Clique (强连通分量,dp)

    给出一个有向图,求一个最大的结点集合,任意两个点u,v.u可到达v或v可到达u. 一个强连通分量肯定一起选的.而且只能在一条路径上. 所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG ...

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

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

  9. UVa 11324 The Largest Clique (强连通分量+DP)

    题意:给定一个有向图,求一个最大的结点集,使得任意两个结点,要么 u 能到 v,要么 v 到u. 析:首先,如果是同一个连通分量,那么要么全选,要么全不选,然后我们就可以先把强连通分量先求出来,然后缩 ...

随机推荐

  1. Redis+Django(Session,Cookie)的用户系统

    一.Django authentication django authentication提供了一个便利的user api接口,无论在py中 request.user,参见Request and re ...

  2. 闲暇时间开发的个人app

    最近一段时间公司不是很忙,晚上基本没怎么加班.所以自己利用晚上在家的时间开发了一个app(奇趣营),其实自从转android开发以来,就有想过要自己开发一个app.一方面可以提升自己的经验:另一方面可 ...

  3. VS2010在运行状态下编辑代码

    在VS2010环境下,当程序处于调试运行状态时,编辑代码会出现下图提示框: 这就给边编辑代码边查看程序运行效果带来不便. 解决方法:在程序没有运行的时候,打开菜单“工具”——>“选项”——> ...

  4. Linux查看端口、进程情况及kill进程

    看端口: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程. 使用命令:netstat –apn 查看所有的进程和端口使用情况.发现下面的进程列表,其中最后一栏是P ...

  5. 获取枚举类型的描述description

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; usin ...

  6. wpf xaml inlines

    string testBold = "<Bold>Sync Now</Bold>";           var ele = System.Windows. ...

  7. Win7 64位 Visio反向工程(MySQL)

    1 看Office的版本,我安装的是32位的版本,故要去MySQL的官网下载对应32位的ODBC驱动: http://dev.mysql.com/downloads/connector/odbc/ 2 ...

  8. python问题:IndentationError:expected an indented block错误解决

    Python语言是一款对缩进非常敏感的语言,给很多初学者带来了困惑,即便是很有经验的Python程序员,也可能陷入陷阱当中.最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分 ...

  9. 如何做好IT运营.

    定义IT管理的重点在于业务策略与 IT 部门提供的服务之间的一致性.IT 管理可建立必要的管理机制来确保可预测的 IT 服务交付,从而确保业务流程和 IT 流程之间的联系.IT 管理传统上属于CIO. ...

  10. fast-framework – 基于 JDK 8 实现的 Java Web MVC 框架

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! fast-framework 轻量级 Java Web 框架 – https://github. ...