UVA11324_The Largest Clique
极大团。即求一个最大点集,使得点集中的任意两个点u,v至少存在u->v,或者v->u的路径。
是这样做的,求出所有的联通分量,然后整个图就变成了无环图,把原来若干个点缩点,点权为分量的点数。这样相当于找一条权值最大的路径,因为无环了,所以这个可以通过先拓扑排序然后dp解决。
这里重点说一下自己遇到的坑吧。
d[cur]=low[cur]=++dfsclock; 绝不能是 d[cur]=low[cur]=d[fa]+1;
后者是错的。
我思考了好久后来才发现问题。如图:

假设我们按照d[fa]+1的方法来打标记,那么当路径为1->2->3时候,递归返回的时候low[1]=1,low[2]=1,low[3]=2,而此时去访问4点,此时low[4]最少也只能是2,那么从程序的角度来说,也就认为了4是单独的强联通分量,这是不对的。
但是如果我们按照++dfsclock的方法来打标记,那么low[1]=1,low[2]=1,low[3]=2,low[4]=2,但是此时d[4]=4,可以判断出不是一个单独的强连通分量。主要是通过++dfsclock可以判断是否以前被访问过,这里与源点距离无关,特别注意了。
召唤代码君:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 1010
#define maxm 202000
using namespace std; int first[maxn],next[maxm],to[maxm],edge;
int low[maxn],d[maxn],belong[maxn],scc;
int U[maxm],V[maxm],stack[maxn],top;
int f[maxn],sum[maxn],Q[maxn];
int n,m,T,ans,dfsclock; bool cmp(int q1,int q2)
{
return d[q1]>d[q2];
} void _init()
{
dfsclock=ans=top=scc=,edge=-;
for (int i=; i<=n; i++) first[i]=-,low[i]=d[i]=belong[i]=;
} void addedge(int uu,int vv)
{
edge++;
to[edge]=vv,next[edge]=first[uu],first[uu]=edge;
} void dfs(int cur,int fa)
{ d[cur]=low[cur]=++dfsclock;
stack[++top]=cur;
for (int i=first[cur]; i!=-; i=next[i])
{
if (belong[to[i]]) continue;
if (!d[to[i]]) dfs(to[i],cur);
low[cur]=min(low[cur],low[to[i]]);
}
if (low[cur]>=d[cur])
for (scc++,f[scc]=;;)
{
belong[stack[top--]]=scc;
f[scc]++;
if (stack[top+]==cur) break;
}
} int get(int x)
{
if (d[x]!=) return d[x];
if (first[x]==-) return d[x]=; d[x]=;
for (int i=first[x]; i!=-; i=next[i])
d[x]=max(d[x],get(to[i])+); return d[x];
} int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
_init();
for (int i=; i<=m; i++)
{
scanf("%d%d",&U[i],&V[i]);
addedge(U[i],V[i]);
}
for (int i=; i<=n; i++)
if (!d[i]) dfs(i,);
edge=-;
for (int i=; i<=scc; i++) first[i]=-,d[i]=;
for (int i=; i<=m; i++)
if (belong[U[i]]!=belong[V[i]])
addedge(belong[U[i]],belong[V[i]]); for (int i=; i<=scc; i++)
{
Q[i]=i,sum[i]=;
if (!d[i]) d[i]=get(i);
}
sort(Q+,Q++scc,cmp);
for (int i=; i<=scc; i++)
{
sum[Q[i]]+=f[Q[i]];
ans=max(ans,sum[Q[i]]);
for (int j=first[Q[i]]; j!=-; j=next[j])
sum[to[j]]=max(sum[to[j]],sum[Q[i]]);
}
printf("%d\n",ans);
}
return ;
}
UVA11324_The Largest Clique的更多相关文章
- UVA11324 The Largest Clique[强连通分量 缩点 DP]
UVA - 11324 The Largest Clique 题意:求一个节点数最大的节点集,使任意两个节点至少从一个可以到另一个 同一个SCC要选一定全选 求SCC 缩点建一个新图得到一个DAG,直 ...
- 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 ...
- 【UVA11324】 The Largest Clique (Tarjan+topsort/记忆化搜索)
UVA11324 The Largest Clique 题目描述 给你一张有向图 \(G\),求一个结点数最大的结点集,使得该结点集中的任意两个结点 \(u\) 和 \(v\) 满足:要么 \(u\) ...
- 图论trainning-part-2 C. The Largest Clique
C. The Largest Clique Time Limit: 3000ms Memory Limit: 131072KB 64-bit integer IO format: %lld ...
- 『题解』UVa11324 The Largest Clique
原文地址 Problem Portal Portal1:UVa Portal2:Luogu Portal3:Vjudge Description Given a directed graph \(\t ...
- UVAoj 11324 - The Largest Clique(tarjan + dp)
题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点 u,v, 都有u->v 或者 v->u 或者u<==>v 思路:首先将强连通分量通过tarjan算法求出 ...
- UVa11324 The Largest Clique(强连通分量+缩点+记忆化搜索)
题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点. 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了. 那么问题就简单了, ...
- uva 11324 The Largest Clique
vjudge 上题目链接:uva 11324 scc + dp,根据大白书上的思路:" 同一个强连通分量中的点要么都选,要么不选.把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它 ...
随机推荐
- SQL Server 内存和换页(Paging)
在进程开始执行时,进程首先申请虚拟地址空间VAS(Virtural Address Space),VAS是进程能够访问的地址空间,由于VAS不是真正的物理内存空间,操作系统必须将VAS隐射到物理内存空 ...
- Design2:使用HierarchyID构建数据的分层结构
1,传统的分层结构是父子结构,表结构中有一个ParentID字段自引用表的主键,表示“归属”关系,例如 create table dbo.emph ( ID int not null primary ...
- 使用VMWareWorkstation10搭建学习环境笔记
第一节:介绍虚拟化技术 虚拟化技术1.在一台计算机运行多个操作系统2.教学环境 测试环境3.和硬件无关4.P to V 物理机->虚拟机(Physical to Virtual) V ...
- virtualBox linux操作系统centos 挂载光盘
virtualBox虚拟机linux centos 挂载光盘 第一步: 放入光盘 第二步: 挂载光驱 (/dev/cdrom) 1) 创建挂载点 mkdir /mnt/media 2) 挂载 moun ...
- 理解粒子滤波(particle filter)
1)初始化阶段-提取跟踪目标特征 该阶段要人工指定跟踪目标,程序计算跟踪目标的特征,比如可以采用目标的颜色特征.具体到Rob Hess的代码,开始时需要人工用鼠标拖动出一个跟踪区域,然后程序自动计算该 ...
- linux 安装配置zookeeper脚本
#!/bin/bash # automatic install zookeeper echo "========= Start to install zookeeper ========== ...
- 深度学习之神经网络核心原理与算法-caffe&keras框架图片分类
之前我们在使用cnn做图片分类的时候使用了CIFAR-10数据集 其他框架对于CIFAR-10的图片分类是怎么做的 来与TensorFlow做对比. Caffe Keras 安装 官方安装文档: ht ...
- PHP版本对比【转】
其他历史http://www.cnblogs.com/yjf512/p/3588466.html php5.3 改动: 1.realpath() 现在是完全与平台无关的. 结果是非法的相对路径比如FI ...
- [buaa-SE-2017]个人作业-Week2
个人作业-Week2 一.代码复审Checklist 1.概要部分 1.1 代码能符合需求和规格说明么? 本次作业的需求可以分成基本的功能实现和大规模数据下程序的健壮性,以及少量的异常处理能力,也就是 ...
- Task 6.2冲刺会议五 /2015-5-18
今天继续深入的看了看服务器的内容,修改了昨天的代码,发现网络编程还是很好玩的,感觉他的代码比平常写的更有趣一点,另外登陆界面也稍微看了一点.明天准备把登陆界面完善一下.