UVAoj 11324 - The Largest Clique(tarjan + dp)
题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点
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)的更多相关文章
- UVA 11324.The Largest Clique tarjan缩点+拓扑dp
题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...
- UVA 11324 - The Largest Clique(强连通分量+缩点)
UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...
- uva 11324 The Largest Clique(图论-tarjan,动态规划)
Problem B: The Largest Clique Given a directed graph G, consider the following transformation. First ...
- uva 11324 The Largest Clique (Tarjan+记忆化)
/*每个环 要么不选 要么全选 可缩点 就得到一个GAD图 然后搞搞算出最大路径*/ #include<iostream> #include<cstdio> #include& ...
- UVA - 11324 The Largest Clique 强连通缩点+记忆化dp
题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...
- UVA 11324 The Largest Clique(缩点+DAG上的dp)
求最大团.和等价性证明有类似之处,只不过这个不是求互推,而是只要a->b,或b->a即可. 同样的,容易想到先缩点,得到DAG,每个节点上保存SCC的点数,相信任意一条由根节点(入度为零) ...
- UVA 11324 The Largest Clique (强连通分量,dp)
给出一个有向图,求一个最大的结点集合,任意两个点u,v.u可到达v或v可到达u. 一个强连通分量肯定一起选的.而且只能在一条路径上. 所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG ...
- UVA 11324 The Largest Clique(强连通分量+缩点DAG的DP)
题意:给定一个有向图,求出一个最大的结点集,这个节点集中的随意两个点之间至少一个能到达还有一个点. 思路:假设一个点在这个节点集中,那么它所在的强连通分量中的点一定所有在这个节点集中,反之亦然, 求出 ...
- UVa 11324 The Largest Clique (强连通分量+DP)
题意:给定一个有向图,求一个最大的结点集,使得任意两个结点,要么 u 能到 v,要么 v 到u. 析:首先,如果是同一个连通分量,那么要么全选,要么全不选,然后我们就可以先把强连通分量先求出来,然后缩 ...
随机推荐
- Python面试题(二)
打印九九乘法表 思路:利用字符串的连接,梯形输出结果 >>> def st(num): ... l = [] ... for x in xrange(1, num + 1): ... ...
- Leetcode-189 Rotate Array
#189. Rotate Array Rotate an array of n elements to the right by k steps. For example, with n = 7 ...
- 【Android】 TextView设置个别字体样式
SpannableString msp = new SpannableString("测试"+XM+"更换当前号码将从手机发送一条普通短信进行验证"); msp ...
- Tomcat 安全配置与性能优化
一.Tomcat内存优化 1.JAVA_OPTS参数说明 Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 JAVA_OP ...
- SVO实时全局光照优化(里程碑MK2):Sparse Voxel Octree based Global Illumination (SVO GI)
自主实现的实时渲染引擎,对标对象ue4/ce5,超越u3d/klayge.MK2版本侧重于质量与速度的均衡,以下上传示范均为实测截图,均为全分辨率(网页上显示缩小了)1080p/60fps.
- sap 怎么导出sap的各种表
其实方法很简单,只是以前一直没用过! 进入事务码se84
- Oracle中group by用法
Oracle中group by用法 在select 语句中可以使用group by 子句将行划分成较小的组,一旦使用分组后select操作的对象变为各个分组后的数据,使用聚组函数返回的是每一个组的汇总 ...
- Django 源码小剖: Django ORM 查询管理器
ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从 ...
- vue开发资料
http://cn.vuejs.org/v2/guide/ (vue框架手册)https://router.vuejs.org/zh-cn/ (vue框架路由手册)https://github.com ...
- Reset Entity-Framework Migrations
You need to delete the state: Delete the migrations folder in your project Delete the __MigrationHis ...