uva 11324 The Largest Clique
vjudge 上题目链接:uva 11324
scc + dp,根据大白书上的思路:" 同一个强连通分量中的点要么都选,要么不选。把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它的结点数,则题目转化为求 SCC 图上权最大的路径。由于 SCC 图是一个 DAG, 可以用动态规划求解。"
一开始我理解成了求所有结点的权值和,后来才明白所求的结果一定是 scc 上一条路径来的,即不能有任何分叉路径。我的代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N = ; vector<int> G[N], G2[N];
bool vis[N];
int sccno[N], scc_cnt, p[N];
vector<int> S; void dfs(int x) {
vis[x] = ;
for(int i = ; i < G[x].size(); ++i)
if(!vis[G[x][i]]) dfs(G[x][i]);
S.push_back(x);
} void dfs2(int x, int &num) {
if(sccno[x]) return ;
sccno[x] = scc_cnt;
++num;
for(int i = ; i < G2[x].size(); ++i)
dfs2(G2[x][i], num);
} void find_scc(int n) {
memset(vis, , sizeof vis);
S.clear();
for(int i = ; i < n; ++i)
if(!vis[i]) dfs(i); memset(sccno, , sizeof sccno);
memset(p, , sizeof p);
scc_cnt = ;
for(int i = n - ; i >= ; --i)
if(!sccno[S[i]]) {
++scc_cnt;
int num = ;
dfs2(S[i], num);
p[scc_cnt] = num;
}
} vector<int> d[N];
void debug(int n) {
for(int i = ; i < n; ++i)
d[i].clear();
for(int i = ; i < n; ++i)
d[sccno[i]].push_back(i); for(int u = ; u <= scc_cnt; ++u) {
printf("sccno[%d]: ",u);
for(int i = ; i < d[u].size(); ++i)
printf("%d ",d[u][i] + );
printf(" num = %d p[%d] = %d\n", d[u].size(), u, p[u]);
}
} vector<int> g3[N];
int node(int x) {
if(vis[x]) return p[x];
vis[x] = ;
int Max = ;
for(int i = ; i < g3[x].size(); ++i)
Max = max(Max, node(g3[x][i]));
return p[x] += Max;
} void new_graph(int n) {
for(int i = ; i <= n; ++i)
g3[i].clear();
for(int u = ; u < n; ++u)
for(int i = ; i < G[u].size(); ++i) {
int v = G[u][i];
if(sccno[u] != sccno[v]) g3[sccno[u]].push_back(sccno[v]);
}
memset(vis, , sizeof vis);
int ans = ;
for(int i = ; i <= scc_cnt; ++i)
ans = max(ans, node(i));
printf("%d\n",ans);
} int main() {
int t,n,m,x,y;
scanf("%d",&t);
while(t--) {
scanf("%d %d",&n,&m);
for(int i = ; i < n; ++i) {
G[i].clear();
G2[i].clear();
}
while(m--) {
scanf("%d %d",&x,&y);
--x; --y;
G[x].push_back(y);
G2[y].push_back(x);
}
find_scc(n);
// debug(n);
new_graph(n);
}
return ;
}
uva 11324 The Largest Clique的更多相关文章
- 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(强连通分量缩点+DAG动态规划)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=sh ...
- 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)
题意:给定一个有向图,求出一个最大的结点集,这个节点集中的随意两个点之间至少一个能到达还有一个点. 思路:假设一个点在这个节点集中,那么它所在的强连通分量中的点一定所有在这个节点集中,反之亦然, 求出 ...
- UVA 11324.The Largest Clique tarjan缩点+拓扑dp
题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...
- UVa 11324 The Largest Clique (强连通分量+DP)
题意:给定一个有向图,求一个最大的结点集,使得任意两个结点,要么 u 能到 v,要么 v 到u. 析:首先,如果是同一个连通分量,那么要么全选,要么全不选,然后我们就可以先把强连通分量先求出来,然后缩 ...
- UVA - 11324 The Largest Clique (强连通缩点+dp)
题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u. 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可. 感觉 ...
随机推荐
- [ios][swift]swift混编
http://blog.csdn.net/iflychenyang/article/details/8876542(如何在Objective-C的头文件引用C++的头文件) 1.将.m文件扩展名改为. ...
- CI框架分页类
分页类1.分页类参数说明 'base_url' => 指向你的分页所在的控制器类/方法的完整的 URL, 'total_rows' => 数据的总行数, 'per_page' => ...
- js编程-面相对象
//js面相对象编程 //定义constructor构造方法 function myFn(name,sex){ this.name = name; this.sex = sex; } //用proto ...
- MAVEN安装过程
maven 的压缩包地址: http://pan.baidu.com/s/1kT4ckGf 第三方资源jar包地址: http://pan.baidu.com/s/1i3vtgED
- 20150604_Andriod 窗体PopupWindow
package com.example.test1; import android.support.v7.app.ActionBarActivity;import android.os.Bundle; ...
- Unity脚本在层级面板中的执行顺序测试1
第二篇测试循环时和动态创建时的调用顺序:LINK 测试版本Unity4.6.因为新版本对Transform的排序做了改变,所以不排除旧版本的测试结果不一样.测试时,使用Awake中添加Debug.lo ...
- java中的动态代理机制
java中的动态代理机制 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现 ...
- hdu 2258 优先队列
Continuous Same Game (1) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- Mysql-学习笔记(==》增删主键建立索引 七)
SHOW FULL COLUMNS FROM teacher; -- 增加删除主键 alterCREATE TABLE tt(t INT);ALTER TABLE tt ADD CONSTRAINT ...
- 2016年6月29日 星期三 --出埃及记 Exodus 14:26
2016年6月29日 星期三 --出埃及记 Exodus 14:26 Then the LORD said to Moses, "Stretch out your hand over the ...