UVA 11324 The Largest Clique (强连通分量,dp)
给出一个有向图,求一个最大的结点集合,任意两个点u,v。u可到达v或v可到达u。
一个强连通分量肯定一起选的。而且只能在一条路径上。
所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG上的dp。
注意0,0这组数据
#include<bits/stdc++.h>
using namespace std; const int maxn = ,maxm = 5e5+; int head[maxn],to[maxm],nxt[maxm]; void addEdge(int u,int v,int i)
{
to[i] = v;
nxt[i] = head[u];
head[u] = i;
} int pre[maxn],low[maxn],sccno[maxn],dfs_clock,scc_cnt;
stack<int> stk; void tarjan(int u)
{
pre[u] = low[u] = ++dfs_clock;
stk.push(u);
for(int i = head[u]; ~i; i = nxt[i]){
int v = to[i];
if(!pre[v]){
tarjan(v);
low[u] = min(low[u],low[v]);
}else if(!sccno[v]){
low[u] = min(low[u],pre[v]);
}
}
if(pre[u] == low[u]){
scc_cnt++;
while(stk.size()){
int x = stk.top(); stk.pop();
sccno[x] = scc_cnt;
if(x == u) break;
}
}
} void find_scc(int n)
{
memset(pre,,sizeof(pre));
memset(sccno,,sizeof(sccno));
dfs_clock = scc_cnt = ;
for(int i = ; i < n; i++){
if(!pre[i]) tarjan(i);
}
} vector<int> G[maxn];
int wei[maxn], deg[maxn]; void buildDAG(int n)
{
for(int i = ; i <= scc_cnt; i++) G[i].clear(),deg[i] = wei[i] = ;
for(int u = ; u < n; u++){
int v0 = sccno[u]; wei[v0]++;
for(int i = head[u]; ~i; i = nxt[i]){
int v1 = sccno[to[i]];
if(v0 != v1) G[v0].push_back(v1),deg[v1]++;
}
}
} int dp[maxn];
int topo()
{
memset(dp,-,sizeof(dp));
queue<int> q;
for(int i = ; i <= scc_cnt; i++){
if(!deg[i]) q.push(i),dp[i] = wei[i];
}
while(q.size()){
int u = q.front(); q.pop();
for(int i = ; i < (int)G[u].size(); i++){
int v = G[u][i];
dp[v] = max(dp[v],dp[u]+wei[v]);
if(--deg[v] == ) q.push(v);
}
}
int ans = ;
for(int i = ; i <= scc_cnt; i++){
ans = max(dp[i],ans);
}
return ans;
} int main()
{
//freopen("in.txt","r",stdin);
int T; scanf("%d",&T);
while(T--){
int n,m;
memset(head,-,sizeof(head));
scanf("%d%d",&n,&m);
for(int i = ; i < m; i++){
int u,v; scanf("%d%d",&u,&v);
addEdge(u-,v-,i);
}
find_scc(n);
buildDAG(n);
printf("%d\n",topo());
}
return ;
}
UVA 11324 The Largest Clique (强连通分量,dp)的更多相关文章
- UVa 11324 The Largest Clique (强连通分量+DP)
题意:给定一个有向图,求一个最大的结点集,使得任意两个结点,要么 u 能到 v,要么 v 到u. 析:首先,如果是同一个连通分量,那么要么全选,要么全不选,然后我们就可以先把强连通分量先求出来,然后缩 ...
- UVA 11324 The Largest Clique(强连通分量+缩点DAG的DP)
题意:给定一个有向图,求出一个最大的结点集,这个节点集中的随意两个点之间至少一个能到达还有一个点. 思路:假设一个点在这个节点集中,那么它所在的强连通分量中的点一定所有在这个节点集中,反之亦然, 求出 ...
- 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 强连通缩点+记忆化dp
题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...
- UVA - 11324 The Largest Clique (强连通缩点+dp)
题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u. 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可. 感觉 ...
- UVA 11324 - The Largest Clique(强连通分量+缩点)
UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...
- UVA11324 The Largest Clique[强连通分量 缩点 DP]
UVA - 11324 The Largest Clique 题意:求一个节点数最大的节点集,使任意两个节点至少从一个可以到另一个 同一个SCC要选一定全选 求SCC 缩点建一个新图得到一个DAG,直 ...
- UVA11324 The Largest Clique —— 强连通分量 + 缩点 + DP
题目链接:https://vjudge.net/problem/UVA-11324 题解: 题意:给出一张有向图,求一个结点数最大的结点集,使得任意两个结点u.v,要么u能到达v, 要么v能到达u(u ...
- uva 11324 The Largest Clique
vjudge 上题目链接:uva 11324 scc + dp,根据大白书上的思路:" 同一个强连通分量中的点要么都选,要么不选.把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它 ...
随机推荐
- ubuntu删除g2o
解决方法为:(1)删除/usr/local/include/g2o,指令为sudo rm -rf /usr/local/include/g2o:(2)删除/usr/local/lib下有关libg2o ...
- 1.18-1.21 Oozie Coordinator调度
一.时区问题 1.修改系统时区 ## [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# rm -rf /etc/localtime [root@hadoop-se ...
- WeFlow 简单使用教程
一.前言 WeFlow 是什么?一个高效.强大.跨平台的前端开发工作流工具.(官网定义),下载那些你们都知道,我就不一 一介绍了.下面我说一下简单使用: 二.使用教程 首先,我们使用 WeFlow 是 ...
- Appium + junit 的简单实例
import static junit.framework.Assert.assertTrue; import static org.junit.Assert.*; import org.junit. ...
- opengl VAO ,VBO
A Vertex Array Object (VAO) is an object which contains one or more Vertex Buffer Objects and is des ...
- bzoj 3876: [Ahoi2014&Jsoi2014]支线剧情【有上下界有源汇最小费用最大流】
每条边流量有下界有费用,很显然是有上下界有源汇最小费用最大流 连边(s,1,(0,inf),0),(i,t,(0,inf),0),表示从1出发inf次从每个点结束inf次 连边(i,j,(1,inf) ...
- P3270 [JLOI2016]成绩比较(拉格朗日插值)
传送门 挺神仙的啊-- 设\(f[i][j]\)为考虑前\(i\)门课程,有\(j\)个人被\(B\)爷碾压的方案数,那么转移为\[f[i][j]=\sum_{k=j}^{n-1}f[i-1][k]\ ...
- spoj3105 MOD - Power Modulo Inverted(exbsgs)
传送门 关于exbsgs是个什么东东可以去看看yyb大佬的博客->这里 //minamoto #include<iostream> #include<cstdio> #i ...
- 【OpenJ_Bailian - 2797】最短前缀(贪心)
最短前缀 Descriptions: 一个字符串的前缀是从该字符串的第一个字符起始的一个子串.例如 "carbon"的字串是: "c", "ca&qu ...
- java 三大基本特征
java中的面向对象的三大基本特征是:[封装].[继承].[多态] 封装:对象要有一个明确的边界:边界的划分(对象各司其职.对象的粒度.对象的可重用性) 属性(bean.pojo):私有的privat ...