Problem B: The Largest Clique

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.

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.

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

Output for sample input

4

Zachary Friggstad

题目大意:

T组測试数据。给一张有向图G。求一个结点数最大的结点集,使得该结点中随意两个结点 u 和 v满足:要么 u 能够到达 v。 要么 v 能够到达 u(u 和 v 相互可达也能够)。

解题思路:

”同一个强连通分量中的点要么都选,要么不选。把强连通分量收缩点后得到SCC图。让每一个SCC结点的权等于它的结点数,则题目转化为求SCC图上权最大的路径。因为SCC图是一个 DAG, 能够用动态规划求解。

解题代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std; const int maxn=1100;
const int maxm=51000; struct edge{
int u,v,next;
edge(int u0=0,int v0=0){
u=u0;v=v0;
}
}e[maxm]; int n,m,head[maxn],dfn[maxn],low[maxn],mark[maxn],w[maxn],color[maxn],dp[maxn],cnt,nc,index;
vector <int> vec;
vector <vector<int> > dfsmap; void addedge(int u,int v){
e[cnt]=edge(u,v);e[cnt].next=head[u];head[u]=cnt++;
} void input(){
cnt=nc=index=0;
scanf("%d%d",&n,&m);
vec.clear();
for(int i=0;i<=n;i++){
w[i]=dfn[i]=0;
mark[i]=false;
color[i]=dp[i]=head[i]=-1;
}
int u,v;
while(m-- >0){
scanf("%d%d",&u,&v);
addedge(u,v);
}
} void tarjan(int s){
dfn[s]=low[s]=++index;
mark[s]=true;
vec.push_back(s);
for(int i=head[s];i!=-1;i=e[i].next){
int d=e[i].v;
if(!dfn[d]){
tarjan(d);
low[s]=min(low[d],low[s]);
}else if(mark[d]){
low[s]=min(low[s],dfn[d]);
}
}
if(dfn[s]==low[s]){
nc++;
int d;
do{
d=vec.back();
vec.pop_back();
color[d]=nc;
mark[d]=false;
w[nc]++;
}while(d!=s);
}
} int DP(int s){
if(dp[s]!=-1) return dp[s];
int ans=w[s];
for(int i=0;i<dfsmap[s].size();i++){
int d=dfsmap[s][i];
if(DP(d)+w[s]>ans) ans=DP(d)+w[s];
}
return dp[s]=ans;
} void solve(){
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
dfsmap.clear();
dfsmap.resize(nc+1);
for(int i=0;i<cnt;i++){
int x=color[e[i].u],y=color[e[i].v];
if(x!=y){
dfsmap[x].push_back(y);
//cout<<x<<"->"<<y<<endl;
}
}
int ans=0;
for(int i=1;i<=nc;i++){
if(DP(i)>ans) ans=DP(i);
//cout<<i<<" "<<ans<<endl;
}
printf("%d\n",ans);
} int main(){
int t;
scanf("%d",&t);
while(t-- >0){
input();
solve();
}
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

uva 11324 The Largest Clique(图论-tarjan,动态规划)的更多相关文章

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

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

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

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

  3. uva 11324 The Largest Clique

    vjudge 上题目链接:uva 11324 scc + dp,根据大白书上的思路:" 同一个强连通分量中的点要么都选,要么不选.把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它 ...

  4. uva 11324 The Largest Clique(强连通分量缩点+DAG动态规划)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=sh ...

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

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

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

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

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

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

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

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

  9. Uva 11324 The Largest Clique【强连通 DAG动规 spfa】

    白书上的例题 做一遍tarjan后,缩点,每一个scc节点的权为它的结点数,做一次DAG上的动规,求出路径上的最大点权和,就可以了 #include<cstdio> #include< ...

随机推荐

  1. Kafka 高性能吞吐揭秘

    Kafka 高性能吞吐揭秘   Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分 ...

  2. 二、第一个ExtJS程序:helloExtJS

    开发前的准备 下载并解压ExtJS包后,能够得到下图的文件文件夹结构: 在实际开发过程中并不须要全部的文件和文件夹,所需的包括例如以下文件夹就可以: 若使用eclipse进行开发,仅仅需将上述文件拷贝 ...

  3. Android5.0L下因sensorservice crash导致systemserver重新启动的第二种场景分析

    一.出问题的场景 1.Sensorservice线程正在处理compass sensor事件的过程中.检查了一次buffer的指针的有效性,并在稍后会传递到AKM获取数据的函数接口中使用 2.Sens ...

  4. SQL Server Compact免安装部署

    原文:SQL Server Compact免安装部署 情况 应用程序中的EF使用了SQL Server Compact,打包部署到客户机器上后提示数据库连接异常,信息类似”配置节“.”Provider ...

  5. POJ3050 Hopscotch 【DFS】

    Hopscotch Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2113   Accepted: 1514 Descrip ...

  6. 用Tomcat和Eclipse开发Servlet程序

    1. 安装eclipse 1). 在官网上直接下载Eclipse IDE for Java EE Developers,解压即可: 2. eclipse安装tomcat插件: 1). 在http:// ...

  7. Maven插件之buildnumber-maven-plugin

    某些情况下(这种情况一般很少见),使用maven构建项目时,需要一个不重复的序列号,比如说,打包时,包名称以当前构建时间结尾,或者每次生成的jar包中包含唯一的序列号,等等; 这个时候,就用到了bui ...

  8. 怎样在屏幕上显示多个alv

    本文解说怎样在屏幕上显示多个alv. 实现这种需求关键是下面几点(举例:在屏幕上显示4个alv): 1.须要定义4个alv control 2.由于有4个alv control,于是就须要定义4个容器 ...

  9. mini2440裸试验—计算器(LCD显示,触摸屏突破)

    关于Pait_Bmp(x0, y0, x, y, BMPaddr);函数 像素图在屏幕左上角为(0,0),Pait_Bmp中的x0.y0分别像素点初始位置,x,y为BMP图片的X,Y的大小.BMPad ...

  10. Array of Objects

    You should be comfortable with the content in the modules up to and including the module "Array ...