UVA - 11324 The Largest Clique (强连通缩点+dp)
题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u。
解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可。
感觉自己的建图写得好丑啊,一直在纠结用数组还是结构体~~
#include<bits/stdc++.h> using namespace std;
const int N=1e5+;
int head[N],nxt[N],to[N],ne,n,m;
void addedge(int* head,int u,int v) {
nxt[ne]=head[u],to[ne]=v,head[u]=ne++;
}
int dfn[N],low[N],scc[N],sta[N],nscc,nsta,tot,siz[N];
int head2[N]; void dfs(int u) {
dfn[u]=low[u]=++tot;
sta[nsta++]=u;
for(int e=head[u]; ~e; e=nxt[e]) {
int v=to[e];
if(!dfn[v])dfs(v),low[u]=min(low[u],low[v]);
else if(!scc[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]) {
nscc++;
for(; !scc[u]; scc[sta[--nsta]]=nscc);
}
} void getscc() {
memset(dfn,,sizeof dfn);
memset(scc,,sizeof scc);
tot=nscc=nsta=;
for(int i=; i<=n; ++i)if(!dfn[i])dfs(i);
} int d[N]; int dp(int u) {
if(~d[u])return d[u];
int x=;
for(int e=head2[u]; ~e; e=nxt[e]) {
int v=to[e];
x=max(x,dp(v));
}
return d[u]=siz[u]+x;
} int main() {
int T;
scanf("%d",&T);
while(T--) {
memset(head,-,sizeof head);
memset(head2,-,sizeof head2);
ne=;
scanf("%d%d",&n,&m);
while(m--) {
int u,v;
scanf("%d%d",&u,&v);
addedge(head,u,v);
}
getscc();
memset(siz,,sizeof siz);
for(int u=; u<=n; ++u)siz[scc[u]]++;
for(int u=; u<=n; ++u) {
for(int e=head[u]; ~e; e=nxt[e]) {
int v=to[e];
if(scc[u]!=scc[v])addedge(head2,scc[u],scc[v]);
}
}
memset(d,-,sizeof d);
int ans=;
for(int i=; i<=nscc; ++i)ans=max(ans,dp(i));
printf("%d\n",ans);
}
return ;
}
UVA - 11324 The Largest Clique (强连通缩点+dp)的更多相关文章
- UVA - 11324 The Largest Clique 强连通缩点+记忆化dp
题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...
- 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(强连通分量+缩点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(缩点+DAG上的dp)
求最大团.和等价性证明有类似之处,只不过这个不是求互推,而是只要a->b,或b->a即可. 同样的,容易想到先缩点,得到DAG,每个节点上保存SCC的点数,相信任意一条由根节点(入度为零) ...
- UVA11324 The Largest Clique (强连通缩点+DP最长路)
<题目链接> 题目大意: 给你一张有向图 G,求一个结点数最大的结点集,使得该结点集中的任意两个结点 u 和 v 满足:要么 u 可以达 v,要么 v 可以达 u(u,v相互可达也行). ...
- UVA 11324 - The Largest Clique(强连通分量+缩点)
UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...
- uva 11324 The Largest Clique
vjudge 上题目链接:uva 11324 scc + dp,根据大白书上的思路:" 同一个强连通分量中的点要么都选,要么不选.把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它 ...
随机推荐
- Java多线程(Java总结篇)
Java总结篇:Java多线程 多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上 ...
- mysql分组查询报错
执行sql group by查询时报错 SELECT id from userz GROUP BY username Expression #1 of SELECT list is not in GR ...
- PAT 天梯赛 L1-033. 出生年 【水】
题目链接 https://www.patest.cn/contests/gplt/L1-033 AC代码 #include <cstdio> #include <cstring> ...
- Windows读写文件的猫腻
这里主要涉及对于回车换行的讨论. 回车:\r 换行:\n Windows读写文件分为普通文件读写和二进制文件读写. 如果以二进制的方式读写文件(如rb, wb),将会完全的把文件内容读出来,不做任何处 ...
- 【HackerRank】Closest Numbers
Sorting is often useful as the first step in many different tasks. The most common task is to make f ...
- 每日练习level-7
1.有序列表.无序列表.自定义列表如何使用?写个简单的例子.三者在语义上有什么区别?使用场景是什么? 能否嵌套? 有序列表是一列使用数字进行标记的项目,它使用<li>包含于<ol&g ...
- 深入理解JVM1
1 Java技术与Java虚拟机 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言.Java类文件格式.Java虚拟机和Java应用程 ...
- Qt使用QCustomPlot开发
一.入门 1.下载源文件http://www.qcustomplot.com/: 2.把.cpp和.h放在工程目录下,并将cpp和h加入工程: 3.在.pro中:QT += printsupport: ...
- Ubuntu或Linux搭建网站环境常见问题详解
本屌丝常见的问题已经全部记录如下,如大家有其他问题欢迎随时跟我进行交流. 1.无法进行软件源安装 提示信息:Package has no installation candidate 具体信息如下: ...
- Codeforces Round #390 (Div. 2) A B C D
这是一场比较难的div2 ... 比赛的时候只出了AB A很有意思 给出n个数 要求随意的把相邻的数合并成任意多数 最后没有为0的数 输出合并区间个数与区间 可以想到0可以合到任何数上并不改变该数的性 ...