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即可. 感觉 ...
随机推荐
- sass初步认识1
sass是一种“css预处理器”,同类的还有less等,方法类似.css预处理器的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的css文件. 使用sass需要先暗转RUBY,再 ...
- ZOJ 3866 - Cylinder Candy
3866 - Cylinder Candy Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu ...
- YTU 2973: C语言习题5.25--文件操作2
2973: C语言习题5.25--文件操作2 时间限制: 1 Sec 内存限制: 128 MB 提交: 242 解决: 105 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编 ...
- c#danliemosih
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 打印机 ...
- Let the Balloon Rise 分类: HDU 2015-06-19 19:11 7人阅读 评论(0) 收藏
Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- Eclipse启动提示Failed to load the JNI shared library JVM.dll
一.出现了上述问题解决办法 1.查看eclipse.ini文件 看看eclipse环境架构需要的是什么. plugins/org.eclipse.equinox.launcher.win32.win3 ...
- javascript实现非递归--归并排序
另一道面试题是实现归并排序,当然,本人很不喜欢递归法,因为递归一般都是没有迭代法好.所以首选都是用迭代法,但是迭代法确实是难做啊,至底而上的思想不好把握. 这是我的实现代码 /* * * 非递归版归并 ...
- C语言中的库是什么
在使用tc编写程序时,你或许对其中的*.lib文件产生疑问,这些lib文件有什么用途? 用C 语言编程时,通常要建立一些用户函数.如果这些函数具有通用性,一般的方法是将它们作成头文件,当需要时用“#i ...
- C# 正则表达式 转自-每日一bo
最近写爬虫时需要用到正则表达式,有段时间没有使用正则表达式现在渐渐感觉有些淡忘,现在使用还需要去查询一些资料.为了避免以后这样的情况,在此记录下正则表达式的一些基本使用方法附带小的实例.让以后在使用时 ...
- Gearman任务分布系统部署windows平台_使用Cygwin
1.下载Cygwin http://www.cygwin.com/ 然后选择 Install from Internet -> Direct Connection -> 选择第一个网址就 ...