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结点的权等于它 ...
随机推荐
- FZU 2150 Fire Game (高姿势bfs--两个起点)(路径不重叠:一个队列同时跑)
Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows ...
- E20181029-hm
cardinality 基数 entity n. 实体; 实际存在物; 本质; distribute vt. 分配,散布; 散发,分发; 把…分类; [电] 配电; replica n. 复制品; ...
- 基于thinkphp5的Excel上传
涉及知识点: thinkphp5.0: excel上传: mysql建立新表(基本的create语句): mysql ignore(避免重复插入): 主要功能: 通过在视图中上传excel文件,在my ...
- bzoj3771: Triple(容斥+生成函数+FFT)
传送门 咳咳忘了容斥了-- 设\(A(x)\)为斧头的生成函数,其中第\(x^i\)项的系数为价值为\(i\)的斧头个数,那么\(A(x)+A^2(x)+A^3(x)\)就是答案(于是信心满满的打了一 ...
- [Xcode 实际操作]七、文件与数据-(16)解析XML文档
目录:[Swift]Xcode实际操作 本文将演示如何解析XML文档. 项目中已添加一份XML文档:worker.xml <?xml version="1.0" encodi ...
- 要单独拿出来讲的a标签
a标签的属性 href属性赐予a标签力量:href属性指定要通过a标签借助浏览器请求的资源,可以是图片.视屏.网站.音频等.不加herf属性的a标签就是一个没有任何特殊样式和功能的文本容器. targ ...
- 企业级应用,如何实现服务化三(dubbo入门案例)
今天是六一儿童节,从千里之外的广州,回到了贵州老家,真好!好山好水好心情,好了接着写点东西.这是企业级应用,如何实现服务化系列的第三篇.在上一篇:企业级应用,如何实现服务化二(dubbo架构)中,认识 ...
- go系列(1)- linux下安装go环境
安装GO 打开安装包下载地址,查看linux下go的最新版本 https://golang.google.cn/dl/ 经查看go的最新版本为go1.11.4.linux-amd64.tar.gz 右 ...
- Gitlab备份,Crontab定时备份
1:Gitlab备份非常简单,只需要一条命令就可以创建完整的备份 gitlab-rake gitlab:backup:create 使用以上命令,就相当于在/var/opt/gitlab/backup ...
- python 基础(九) 文件操作
文件操作 一.函数: f = open(’文件名','打开方式'[,encoding='字符编码']) open 打开的方式 字符 说明 r 只读的方式打开 rb 以二进制的形式打开文件 只读 r+ ...