告诉你某些人的年龄大小关系,问你把所有的人分成若干个组,最少需要多少组,使得组内任意两个人的年龄不可比。

首先考虑特殊情况,如果所有年龄关系构成了一个环,那么这个环中所有人的年龄都是相等,也就是可比的。

同时所有其他的与这个环中任意一个点相连的任意一个环或者点都是可比的。

如果两个点或者环,无法处在同一条路径上,那么这两个点和环就是不可比的。

于是算法就出来了。

对于每一个强连通分量,我们将其缩为一个点,点权为这个连通分量中的点数。这样就相当于我们找一条权值最大的路径就好了。

由于缩点后一定是一个有向无环图,那么可以通过dp或者记忆化搜索解决问题。

召唤代码君:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#define maxn 600600
using namespace std; vector<int> V[maxn];
int to[maxn],next[maxn],first[maxn],edge;
int d[maxn],f[maxn],low[maxn],belong[maxn],ans;
int stack[maxn],top;
int n,m,sccnum,dfs_clock; void _init()
{
edge=ans=;
top=sccnum=;
memset(first,-,sizeof(int)*(n+));
memset(d,,sizeof(int)*(n+));
memset(belong,,sizeof(int)*(n+));
} void addedge(int U,int V)
{
if (U==V) return;
to[edge]=V,next[edge]=first[U],first[U]=edge++;
} void dfs(int cur)
{
d[cur]=low[cur]=++dfs_clock;
stack[++top]=cur;
for (int i=first[cur]; i!=-; i=next[i])
if (!d[to[i]]){
dfs(to[i]);
low[cur]=min(low[cur],low[to[i]]);
}
else if (!belong[to[i]]) low[cur]=min(low[cur],d[to[i]]);
if (low[cur]==d[cur]){
V[++sccnum].clear();
f[sccnum]=;
for (;;){
int x=stack[top--];
belong[x]=sccnum;
f[sccnum]++;
if (x==cur) break;
}
}
} int get(int x)
{
if (d[x]!=-) return d[x];
d[x]=;
for (unsigned i=; i<V[x].size(); i++)
d[x]=max(get(V[x][i]),d[x]);
return d[x]=d[x]+f[x];
} int main()
{
int UU,VV;
while (scanf("%d%d",&n,&m)!=EOF){
_init();
while (m--){
scanf("%d%d",&UU,&VV);
addedge(UU,VV);
}
for (int i=; i<=n; i++)
if (!d[i]) dfs(i);
for (int i=; i<=n; i++)
for (int j=first[i]; j!=-; j=next[j])
if (belong[i]!=belong[to[j]])
V[belong[i]].push_back(belong[to[j]]);
memset(d,-,sizeof(int)*(sccnum+));
for (int i=; i<=sccnum; i++)
ans=max(ans,get(i));
printf("%d\n",ans);
}
return ;
}

ZOJ3795_Grouping的更多相关文章

随机推荐

  1. webdriver对象定位方法

    webdriver提供了一系列的对象定位方法,常用的有以下几种 · id · name · class name · link text · partial link text · tag name ...

  2. ubuntu 安装 netbeans C++ IDE

    # sudo apt-get install openjdk-7-jdk # sudo apt-get install g++ # cd ~/Downloads # wget http://downl ...

  3. Ajax基本结构

    $.ajax({ url: "连接到的一般处理程序", data: { "服务端获取时的名称": 获取的用户端的值 }, type: "post&qu ...

  4. android Activity绑定Service

    activity可以绑定Service,并且可以调用Service中定义的方法 Service代码:在里面多了一个IBinder;个人理解是用来与Activity绑定的主要通道: public cla ...

  5. python学习笔记4-redis multi watch实现锁库存

    python 关于redis的基本操作网上已经很多了,这里主要介绍点个人觉得有意思的内容1.redis的事务操作以及watch 乐观锁:后面描述2.tornado下异步使用redis的方式       ...

  6. html初学者了解的笔记02

    一.Html简介 HTML 是一种标记语言 忽略大小写,语法宽松 使用 HTML 标记和元素,可以: 控制页面和内容的外观 发布联机文档 使用 HTML 文档中插入的链接检索联机信息 创建联机表单,收 ...

  7. sscanf与正则表达式(转)

    今天翻google reader的时候看到这样一篇文章,介绍的是sscanf的高级用法.直到今天我才知道sscanf是可以直接用正则表达式的,惭愧. 在msdn中sscanf的声明如下 int ssc ...

  8. 简例 一次执行多条mysql insert语句

    package com.demo.kafka;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Prep ...

  9. Tomcat本地提权漏洞预警(CVE-2016-1240)

    Tomcat是个运行在Apache上的应用服务器,支持运行Servlet/JSP应用程序的容器--可以将Tomcat看作是Apache的扩展,实际上Tomcat也可以独立于Apache运行. 漏洞编号 ...

  10. Nginx Location配置总结

    Nginx Location配置总结 语法规则: location [=|~|~*|^~] /uri/ { - }= 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即 ...