题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点
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)的更多相关文章

  1. UVA 11324.The Largest Clique tarjan缩点+拓扑dp

    题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...

  2. UVA 11324 - The Largest Clique(强连通分量+缩点)

    UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...

  3. uva 11324 The Largest Clique(图论-tarjan,动态规划)

    Problem B: The Largest Clique Given a directed graph G, consider the following transformation. First ...

  4. uva 11324 The Largest Clique (Tarjan+记忆化)

    /*每个环 要么不选 要么全选 可缩点 就得到一个GAD图 然后搞搞算出最大路径*/ #include<iostream> #include<cstdio> #include& ...

  5. UVA - 11324 The Largest Clique 强连通缩点+记忆化dp

    题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...

  6. UVA 11324 The Largest Clique(缩点+DAG上的dp)

    求最大团.和等价性证明有类似之处,只不过这个不是求互推,而是只要a->b,或b->a即可. 同样的,容易想到先缩点,得到DAG,每个节点上保存SCC的点数,相信任意一条由根节点(入度为零) ...

  7. UVA 11324 The Largest Clique (强连通分量,dp)

    给出一个有向图,求一个最大的结点集合,任意两个点u,v.u可到达v或v可到达u. 一个强连通分量肯定一起选的.而且只能在一条路径上. 所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG ...

  8. UVA 11324 The Largest Clique(强连通分量+缩点DAG的DP)

    题意:给定一个有向图,求出一个最大的结点集,这个节点集中的随意两个点之间至少一个能到达还有一个点. 思路:假设一个点在这个节点集中,那么它所在的强连通分量中的点一定所有在这个节点集中,反之亦然, 求出 ...

  9. UVa 11324 The Largest Clique (强连通分量+DP)

    题意:给定一个有向图,求一个最大的结点集,使得任意两个结点,要么 u 能到 v,要么 v 到u. 析:首先,如果是同一个连通分量,那么要么全选,要么全不选,然后我们就可以先把强连通分量先求出来,然后缩 ...

随机推荐

  1. ooj1057: M的整数倍DP

    http://121.249.217.157/JudgeOnline/problem.php?id=1057 1057: M的整数倍 时间限制: 1 Sec  内存限制: 64 MB提交: 130   ...

  2. Android BitmapShader 实战 实现圆形、圆角图片

    转载自:http://blog.csdn.net/lmj623565791/article/details/41967509 1.概述 记得初学那会写过一篇博客Android 完美实现图片圆角和圆形( ...

  3. Android运行时异常“Binary XML file line # : Error inflating class”

    http://blog.csdn.net/huangxiaohu_coder/article/details/8497286 在原生Android下编译APK,编译没有问题,但是在运行的时候经常出现如 ...

  4. Serializable 和 Parcelable 区别

    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0204/2410.html http://www.cnblogs.com/blu ...

  5. Visual Studio 2013 and .NET 4.6

    I'm trying to set the 4.6 .NET framework for my project and in the settings, as it wasn't listed, I ...

  6. sublime3 配置node build环境

    折腾了很久,原来如此简单 1.package control  安装nodejs 2.修改Nodejs.sublime-settings文件,将nodejs路径修改成自己的 3.sublime tex ...

  7. Andriod调用http请求

    // 新建HttpPost对象 HttpPost httpPost = new HttpPost( "http://180.153.1.1:8080/mybankGateway/gatewa ...

  8. 【Theano】安装Theano

    http://blog.csdn.net/niuwei22007/article/details/47684673 http://blog.csdn.net/m624197265/article/de ...

  9. 文件系统管理 之 实例解说 fdisk 使用方法

    一.fdisk 的介绍: fdisk - Partition table manipulator for Linux ,译成中文的意思是磁盘分区表操作工具:本人译的不太好,也没有看中文文档:其实就是分 ...

  10. pip install使用豆瓣源

    这个是老问题了 pip install -i https://pypi.douban.com/simple/ selenium 类似的,npm和gem安装的时候可以使用淘宝源.