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即可. 感觉 ...
随机推荐
- jqeury之轮播图
$(document).ready(function(){ var sWidth = $('#pic1').width(); var len = $('#pic1 .sildebar li').len ...
- CallableAndFuture
Callable和Runnable的区别如下: I Callable定义的方法是call,而Runnable定义的方法是run. II Callable的call方法可以有返回值,而Runn ...
- andriod 新建Activity_ Form
在一个Android工程,如何新建一个Activity? 一:新建一个类(*.class),继承自android.app.Activity类. 二:在res/layout目录下新建一个布局xml文件, ...
- zoj Gao The Sequence
Gao The Sequence Time Limit: 2 Seconds Memory Limit: 65536 KB You are given a sequence of integ ...
- 华东交通大学2016年ACM“双基”程序设计竞赛 1009
Problem Description 华盛顿在寝室洗衣服,遭到了xyf的嫌弃,于是xyf出了道题给华盛顿来做(然而并没有什么关系-v-!)xyf扔给华盛顿n个字符串,这些字符串的长度不超过10000 ...
- (4)Redis 资料
Redis是一种面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景. Redis Home http://redis.io/ MSOpenTech/re ...
- VC++检测当前网络状态
VC获得本机网络连接状态 转载:http://www.cppblog.com/wrhwww/archive/2010/12/02/135230.html //本机网络连接类型(成功) #define ...
- SQL数据库约束行为---防止数据乱填(即数据规范化)
防止乱填:一.Check约束.按照某种规则对数据进行检查.操作:在表的设计界面中,右击相应的列,选择“CHECK约束”在弹出的对话框中,设置约束的名称和表达式. 代码实现: create table ...
- 判断List、Map、Set是否为空及效率比较
//如果object为null,则设置为defaultValue ObjectUtils.defaultIfNull(object, defaultValue); //判断集合是否为null Li ...
- BZOJ 3085: 反质数加强版SAPGAP (反素数搜索)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3085 题意:求n(<=10^100)之内最大的反素数. 思路: 优化2: i ...