UVAoj 11324 - The Largest Clique(tarjan + dp)
题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点
u,v, 都有u->v 或者 v->u 或者u<==>v
思路:首先将强连通分量通过tarjan算法求出来,然后进行缩点,也就是每一个缩点
所组成的图就是一个DAG图!令每一个点的权值就是这个缩点所包含节点(也就是对应的
强连通分量的节点数目),因为强连通分量的任意的两个节点都是相互可达的,那么这个
缩点要么选要么不选,问题就转换成了DAG图上的最长路径!
#include<iostream>
#include<queue>
#include<stack>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define N 1005
using namespace std; struct EDGE{
int u, v, nt;
EDGE(){}
EDGE(int u, int v, int nt) : u(u), v(v), nt(nt){}
}; int first[N];
vector<EDGE>g;
vector<EDGE>gg;
int scc_cnt, dfs_clock;
int scc[N];
int pre[N], low[N];
int dp[N], cnt[N]; int in[N];
int n, m;
stack<int>s; void dfs(int u){
pre[u] = low[u] = ++dfs_clock;
s.push(u);
for(int i = first[u]; ~i; i = g[i].nt){
int v = g[i].v;
if(!pre[v]){
dfs(v);
low[u] = min(low[u], low[v]);
}else if(!scc[v])
low[u] = min(low[u], pre[v]);
}
if(low[u] == pre[u]){
++scc_cnt;
while(){
++cnt[scc_cnt];
int x = s.top(); s.pop();
scc[x] = scc_cnt;
if(x==u) break;
}
}
} void addEdge(int u, int v){
g.push_back(EDGE(u, v, first[u]));
first[u] = g.size() - ;
} void tarjans(){
memset(pre, , sizeof(pre));
memset(scc, , sizeof(scc));
memset(cnt, , sizeof(cnt));
memset(dp, , sizeof(dp));
memset(in, , sizeof(in));
scc_cnt = ;
dfs_clock = ;
for(int i=; i<=n; ++i)
if(!pre[i]) dfs(i);
int len = g.size();
memset(first, -, sizeof(first));
gg.clear();
for(int i=; i<len; ++i)
if(scc[g[i].u] != scc[g[i].v]){
in[scc[g[i].v]]++;
gg.push_back(EDGE(scc[g[i].u], scc[g[i].v], first[scc[g[i].u]]));
first[scc[g[i].u]] = gg.size() - ;
}
int maxN = ;
queue<int>q;
for(int i=; i<=scc_cnt; ++i)
if(!in[i]){
dp[i] = cnt[i];
q.push(i);
if(maxN < dp[i]) maxN = dp[i];
}
while(!q.empty()){
int u = q.front(); q.pop();
for(int i=first[u]; ~i; i = gg[i].nt){
int v = gg[i].v;
dp[v] = max(dp[v], dp[u] + cnt[v]);
q.push(v);
if(maxN < dp[v]) maxN = dp[v];
}
}
printf("%d\n", maxN);
} int main(){
int t;
scanf("%d", &t);
while(t--){
memset(first, -, sizeof(first));
scanf("%d%d", &n, &m);
while(m--){
int u, v;
scanf("%d%d", &u, &v);
addEdge(u, v);
}
tarjans();
g.clear();
}
return ;
}
UVAoj 11324 - The Largest Clique(tarjan + 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(强连通分量+缩点)
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 (Tarjan+记忆化)
/*每个环 要么不选 要么全选 可缩点 就得到一个GAD图 然后搞搞算出最大路径*/ #include<iostream> #include<cstdio> #include& ...
- UVA - 11324 The Largest Clique 强连通缩点+记忆化dp
题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...
- UVA 11324 The Largest Clique(缩点+DAG上的dp)
求最大团.和等价性证明有类似之处,只不过这个不是求互推,而是只要a->b,或b->a即可. 同样的,容易想到先缩点,得到DAG,每个节点上保存SCC的点数,相信任意一条由根节点(入度为零) ...
- UVA 11324 The Largest Clique (强连通分量,dp)
给出一个有向图,求一个最大的结点集合,任意两个点u,v.u可到达v或v可到达u. 一个强连通分量肯定一起选的.而且只能在一条路径上. 所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG ...
- UVA 11324 The Largest Clique(强连通分量+缩点DAG的DP)
题意:给定一个有向图,求出一个最大的结点集,这个节点集中的随意两个点之间至少一个能到达还有一个点. 思路:假设一个点在这个节点集中,那么它所在的强连通分量中的点一定所有在这个节点集中,反之亦然, 求出 ...
- UVa 11324 The Largest Clique (强连通分量+DP)
题意:给定一个有向图,求一个最大的结点集,使得任意两个结点,要么 u 能到 v,要么 v 到u. 析:首先,如果是同一个连通分量,那么要么全选,要么全不选,然后我们就可以先把强连通分量先求出来,然后缩 ...
随机推荐
- Maven学习总结(六)——Maven与Eclipse整合
一.安装Maven插件 下载下来的maven插件如下图所示:,插件存放的路径是:E:/MavenProject/Maven2EclipsePlugin
- 通过swap代码分析C语言指针在汇编级别的实现
我们先用C语言写一个交换两个数的代码: void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp; } int main(void) { ...
- WindowsPhone8拍照功能实现简介
WindowsPhone作为一款智能手机操作系统,支持APP中拍照是必不可少的,目前在WP8上的拍照主要有以下三种途径: 1.使用CameraCaptureTask: 2.使用PhotoCamera类 ...
- Java thread jargon
In Java thread topic, the task to be executed and the thread to drive the task are two concepts shou ...
- ooj1057: M的整数倍DP
http://121.249.217.157/JudgeOnline/problem.php?id=1057 1057: M的整数倍 时间限制: 1 Sec 内存限制: 64 MB提交: 130 ...
- Swift 中范围和区间如何使用?
虽然现在swift语言已经发展到了2.0版了,但是相信很多学习iOS开发的童鞋仍对swift语言存在各种各样的疑问,今天小编将为大家详细介绍swift中的范围和区间,下面我们一起来看看吧. Range ...
- [推荐]T- SQL性能优化详解
[推荐]T- SQL性能优化详解 博客园上一篇好文,T-sql性能优化的 http://www.cnblogs.com/Shaina/archive/2012/04/22/2464576.html
- iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示
iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示 本文介绍其简单使用: 第一步:在本地建立一个访问的服务端. 打开本地终端,在本地新建一个文件夹,在该文件夹中存放测试的html页面. ...
- 安装python官方的mysql库“mysql-connector-python”
$ echo https://cdn.mysql.com/Downloads/Connector-Python/mysql-connector-python-2.1.3.tar.gz >> ...
- 正则指引-字符组demo
class Program { static void Main(string[] args) { string str = "b"; var result1 = Regex.Is ...