UVa11324 最大团 The Largest Clique-有向图强连通分量&DP
https://vjudge.net/problem/UVA-11324
给定一张有向图G,求一个节点数目最大的节点集,使得该集合中的任意两个节点u和v满足:要么u可以到达v,要么v可以到达u(u,v相互可达也算满足),要求输出最大的节点数
Given a directed graph G, consider the following transformation. First, create a new graph T(G) to have the same vertex set as G. Create a directed edge between two vertices u and v in T(G) if and only if there is a path between u and v in G that follows the directed edges only in the forward direction. This graph T(G) is often called the transitive closure of G. We define a clique in a directed graph as a set of vertices U such that for any two vertices u and v in U, there is a directed edge either from u to v or from v to u (or both). The size of a clique is the number of vertices in the clique.
Input The number of cases is given on the first line of input. Each test case describes a graph G. It begins with a line of two integers n and m, where 0 ≤ n ≤ 1000 is the number of vertices of G and 0 ≤ m ≤ 50, 000 is the number of directed edges of G. The vertices of G are numbered from 1 to n. The following m lines contain two distinct integers u and v between 1 and n which define a directed edge from u to v in G.
Output For each test case, output a single integer that is the size of the largest clique in T(G).
Sample Input 1 5 5 1 2 2 3 3 1 4 1 5 2
Sample Output 4
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
;
struct Edge{
int go,next;
};
struct InputEdge{
int from,to;
};
int T,a,b,n,m,book[maxn],bcc_count,v[maxn],end[maxn],end2[maxn],map[maxn][maxn],bcc_node[maxn],mem[maxn];
vector<int> G[maxn],G2[maxn];
vector<InputEdge> inputedge;
vector<int> S;
void init(){
memset(v,,sizeof(v));
memset(book,,sizeof(book));
bcc_count=;
//memset(end,0,sizeof(end));
//memset(end2,0,sizeof(end2));
S.clear();
;i<=n;i++){
G[i].clear();
G2[i].clear();
}
memset(map,,sizeof(map));
inputedge.clear();
memset(bcc_node,,sizeof(bcc_node));
memset(mem,,sizeof(mem));
}
void add(int from,int to){
//Edge e;e.go=to;e.next=end[from];G.push_back(e);end[from]=G.size()-1;
G[from].push_back(to);
}
void add2(int from,int to){
//Edge e;e.go=to;e.next=end2[from];G2.push_back(e);end2[from]=G2.size()-1;
G2[from].push_back(to);
}
void dfs(int u){
v[u]=;
;i<G[u].size();i++){
//int go=G[i].go;
int go=G[u][i];
if(!v[go]) dfs(go);
}
S.push_back(u);
}
void dfs2(int u){
book[u]=bcc_count;
bcc_node[bcc_count]++;
;i<G2[u].size();i++){
//int go=G2[i].go;
int go=G2[u][i];
if(!book[go]) dfs2(go);
}
}
int dp(int x){
if(mem[x]) return mem[x];
int& ans=mem[x];
;i<=bcc_count;i++) if(i!=x&&map[i][x]) ans=max(ans,dp(i)+bcc_node[x]);
if(!ans) ans=bcc_node[x];
return ans;
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&m);
init();
;i<=m;i++){
scanf("%d %d",&a,&b);
add(a,b);add2(b,a);
inputedge.push_back((InputEdge){a,b});
}
;i<=n;i++) if(!v[i]) dfs(i);
;i>=;i--) if(!book[S[i]]){
bcc_count++;
dfs2(S[i]);
}
){
printf("%d\n",n);
continue;
}
;i<inputedge.size();i++){
InputEdge& e=inputedge[i];
map[book[e.;
}
;
;i<=bcc_count;i++)
ans=max(ans,dp(i));
printf("%d\n",ans);
}
;
}
用邻接表存图求BCC会出错....
UVa11324 最大团 The Largest Clique-有向图强连通分量&DP的更多相关文章
- UVa11324 The Largest Clique(强连通分量+缩点+记忆化搜索)
题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点. 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了. 那么问题就简单了, ...
- UVA 11324 - The Largest Clique(强连通分量+缩点)
UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...
- UVA 11324 The Largest Clique (强连通分量,dp)
给出一个有向图,求一个最大的结点集合,任意两个点u,v.u可到达v或v可到达u. 一个强连通分量肯定一起选的.而且只能在一条路径上. 所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG ...
- 有向图强连通分量的Tarjan算法
有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...
- 有向图强连通分量 Tarjan算法
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- 【转】有向图强连通分量的Tarjan算法
原文地址:https://www.byvoid.com/blog/scc-tarjan/ [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly con ...
- 图的连通性:有向图强连通分量-Tarjan算法
参考资料:http://blog.csdn.net/lezg_bkbj/article/details/11538359 上面的资料,把强连通讲的很好很清楚,值得学习. 在一个有向图G中,若两顶点间至 ...
- 有向图强连通分量的Tarjan算法和Kosaraju算法
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- 算法笔记_144:有向图强连通分量的Tarjan算法(Java)
目录 1 问题描述 2 解决方案 1 问题描述 引用自百度百科: 如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连 ...
随机推荐
- VB中判断空的几种方法,Null, Missing, Empty, Nothing, vbNullString区别
vb6中存在几个虚幻的值:Null.Missing.Empty.Nothing.vbNullString.除了最后一个之外,每一个值都不能直接用“a=值”来判断.下面分别解释一下这几个值的含义. 1. ...
- 跟我一起写Makefile--- 变量(嵌套变量+追加变量+overrid+多行变量+环境变量+目标变量+模式变量)
目录(?)[-] 使用变量 一变量的基础 二变量中的变量 三变量高级用法 四追加变量值 五override 指示符 六多行变量 七环境变量 八目标变量 九模式变量 使用变量 ———— 在Makefil ...
- SQL常用方法整理
去除字符串重复项: declare @str varchar(8000) declare @ret varchar(8000),@return varchar(8000) select @str = ...
- SG函数
入门一: 首先来玩个游戏,引用杭电课件上的: (1) 玩家:2人:(2) 道具:23张扑克牌:(3) 规则:游戏双方轮流取牌:每人每次仅限于取1张.2张或3张牌:扑克牌取光,则游戏结束:最后取牌的一方 ...
- [物理学与PDEs]第1章习题参考解答
[物理学与PDEs]第1章习题1 无限长直线的电场强度与电势 [物理学与PDEs]第1章习题2 均匀带电球面的电场强度与电势 [物理学与PDEs]第1章习题3 常场强下电势的定解问题 [物理学与PDE ...
- EditText获取焦点显示输入法时布局自动改变的解决方案
最近在调试Android时,发现当屏幕下方的EditText获取焦点,显示输入法时候.页面布局重新调整而不是整体上移.导致部分控件显示不完全. 最终解决方案是修改项目AnroidManifest.xm ...
- JAVA 综合布局应用
//布局综合应用 import java.awt.*; import javax.swing.*; public class Jiemian4 extends JFrame{ JPanel mb1,m ...
- 树莓派+qt+opencv
树莓派:Qt开发套件和opencv安装sudo apt-get install qt4-dev-tools libqt4-dev 不用qt core 的话,其实只要按照 qt4-qmake就行了(只做 ...
- 30天轻松学习javaweb_打包web项目成war
jar -cvf news.war news 打包成 war 包后复制到webapps下,Tomcat将会解压.
- mac下Android开发环境搭建
之前一段时间在学习ios的开发,近一段时间想着也接触下Android开发,以来加深对移动端开发的理解.这里根据自己配置Android开发环境的过程,比较详细的来总结下自己的安装过程,希望对一些正准备配 ...