ZOJ3795_Grouping
告诉你某些人的年龄大小关系,问你把所有的人分成若干个组,最少需要多少组,使得组内任意两个人的年龄不可比。
首先考虑特殊情况,如果所有年龄关系构成了一个环,那么这个环中所有人的年龄都是相等,也就是可比的。
同时所有其他的与这个环中任意一个点相连的任意一个环或者点都是可比的。
如果两个点或者环,无法处在同一条路径上,那么这两个点和环就是不可比的。
于是算法就出来了。
对于每一个强连通分量,我们将其缩为一个点,点权为这个连通分量中的点数。这样就相当于我们找一条权值最大的路径就好了。
由于缩点后一定是一个有向无环图,那么可以通过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的更多相关文章
随机推荐
- HPUX 只取syslog.log当前三天的信息
LOG_DAYS=1todays_date=`date +%m:%d:%Y`current_date=`echo $todays_date | sed 's/://g'`day=`echo $toda ...
- C# iis错误配置信息( 500.21 - Internal Server Error )
新电脑安装完开发环境后,还需要注册framework4.0到IIS.不然会报错: HTTP 错误 500.21 - Internal Server Error 处理程序"Extensionl ...
- npm 重点小结
npm作为javascript一个用得比较广的包管理工具,已经集成在了node里面,基本一安装node就可以用npm了,十分方便.这里的小结主要沿着官方文档的思路,挑出一些比较重点的,平时常用的部分进 ...
- SQL Server 数据库的安全管理(登录、角色、权限)
---数据库的安全管理 --登录:SQL Server数据库服务器登录的身份验证模式:1)Windows身份验证.2)Windows和SQL Server混合验证 --角色:分类:1)服务器角色.服务 ...
- 【英语魔法俱乐部——读书笔记】 3 高级句型-简化从句&倒装句(Reduced Clauses、Inverted Sentences) 【完结】
[英语魔法俱乐部——读书笔记] 3 高级句型-简化从句&倒装句(Reduced Clauses.Inverted Sentences):(3.1)从属从句简化的通则.(3.2)形容词从句简化. ...
- c#窗体去掉borderstyle进行拖动
private void BaseCForm_Load(object sender, EventArgs e) { DrawStyle(); this.panel1 ...
- libsvm参数学习和核函数使用(转载)
一.参数说明 English libsvm_options: -s svm_type : set type of SVM (default 0) 0 -- C-SVC 1 -- nu-S ...
- B. Checkout Assistant 01背包变形
http://codeforces.com/problemset/problem/19/B 对于每个物品,能偷多ti个,那么先让ti + 1, 表示选了这个东西后,其实就是选了ti + 1个了.那么只 ...
- cell当中的按钮如何获得cell内容
cell当中的btn添加方法 [cell.btn addTarget:self action:@selector(btnClickedwith:) forControlEvents:UIControl ...
- Activity启动模式
------siwuxie095 共4种启动模式:standard singleTop singleTask singleInstance 1.标准启动模式(standard) 也即默认的启动模式 ( ...