Grouping ZOJ - 3795 (tarjan缩点求最长路)
题目链接:https://cn.vjudge.net/problem/ZOJ-3795
题目大意:给你n个人,m个关系, 让你对这个n个人进行分组,要求:尽可能的分组最少,然后每个组里面的人都没有关系。
具体思路:首先对年龄相同的人进行缩点,这些人是肯定不能在同一个组里面的。然后缩完点之后找出剩下的图中一条最长路(每个点的权值就是缩完点之后当前联通块里面的人的个数),我们找出最长路之后(最长路通过拓扑排序判断),这就是答案了。即使有别的图中的人,我们都可以放进这个最长链形成的分组个数中。
AC代码:
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 2e5+;
int n,m,num,ord,col;
int head[maxn],low[maxn],dfn[maxn];
int cont[maxn],in[maxn];
int istack[maxn],dp[maxn];
struct node
{
int fr;
int to;
int nex;
} edge[maxn<<];
vector<int>Map[maxn];
stack<int>q;
void init()
{
num=;
ord=;
col=;
while(!q.empty())
q.pop();
for(int i=; i<=n; i++)
{
head[i]=-;
low[i]=;
dfn[i]=;
cont[i]=;
in[i]=;
istack[i]=;
dp[i]=;
}
}
void addedge(int fr,int to)
{
edge[num].fr=fr;
edge[num].to=to;
edge[num].nex=head[fr];
head[fr]=num++;
}
void dfs(int u)
{
low[u]=dfn[u]=++ord;
q.push(u);
for(int i=head[u]; i!=-; i=edge[i].nex)
{
int to=edge[i].to;
if(dfn[to]==)
{
dfs(to);
low[u]=min(low[u],low[to]);
}
else if(istack[to]==)
{
low[u]=min(low[u],dfn[to]);
}
}
if(low[u]==dfn[u])
{
int t;
col++;
do
{
t=q.top();
q.pop();
istack[t]=col;
cont[col]++;
}
while(t!=u);
}
}
void tarjan()
{
for(int i=; i<=n; i++)
{
if(!dfn[i])
dfs(i);
}
}
void topsort()
{
while(!q.empty())
q.pop();
for(int i=; i<=col; i++)
{
if(!in[i])
q.push(i);
dp[i]=cont[i];
}
while(!q.empty())
{
int top=q.top();
q.pop();
for(int i=; i<Map[top].size(); i++)
{
int to=Map[top][i];
dp[to]=max(dp[to],dp[top]+cont[to]);
if(--in[to]==)
{
q.push(to);
}
}
}
}
int main()
{
while(~scanf("%d %d",&n,&m)){
init();
int st,ed;
for(int i=; i<=m; i++)
{
scanf("%d %d",&st,&ed);
addedge(st,ed);
}
tarjan();
for(int i=; i<=col; i++)
{
Map[i].clear();
}
for(int i=; i<num; i++)//注意这个地方要重新建图。
{
if(istack[edge[i].fr]!=istack[edge[i].to])
{
Map[istack[edge[i].fr]].push_back(istack[edge[i].to]);
in[istack[edge[i].to]]++;
}
}
topsort();
int maxx=;
for(int i=; i<=col; i++)
{
maxx=max(maxx,dp[i]);
}
printf("%d\n",maxx);
}
return ;
}
Grouping ZOJ - 3795 (tarjan缩点求最长路)的更多相关文章
- BZOJ5450: 轰炸(水题,Tarjan缩点求最长路)
5450: 轰炸 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 43 Solved:18[Submit][Status][Discuss] Desc ...
- Tarjan缩点+Spfa最长路【p3627】[APIO2009] 抢掠计划
Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri ...
- 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路
题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...
- HDU 4612 Warm up tarjan缩环+求最长链
Warm up Problem Description N planets are connected by M bidirectional channels that allow instant ...
- BZOJ1093 [ZJOI2007]最大半连通子图 【tarjan缩点 + DAG最长路计数】
题目 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G ...
- [luogu3627 APIO2009] 抢掠计划 (tarjan缩点+spfa最长路)
传送门 Description Input 第一行包含两个整数 N.M.N 表示路口的个数,M 表示道路条数.接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表 ...
- 训练赛 Grouping(强连通分量缩点 + DAG求最长路)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=158#problem/F 大致题意:给出n个人和m种关系(ti,si),表示ti ...
- POJ-3352 Road Construction,tarjan缩点求边双连通!
Road Construction 本来不想做这个题,下午总结的时候发现自己花了一周的时间学连通图却连什么是边双连通不清楚,于是百度了一下相关内容,原来就是一个点到另一个至少有两条不同的路. 题意:给 ...
- tarjan 缩点 求 scc
算法学自 BYVoid https://www.byvoid.com/zhs/blog/scc-tarjan/ 这个写得很清楚了 当然 你可能不这么认为 而且 如果是让我 一开始就从这个博客 学 ta ...
随机推荐
- 在spring中如何生成一个bean (一个对象,比如jedis的连接池对象)【我】
在spring中,要想生成一个单例对象(比如jedis的连接池对象) 方法1: 在 spring中用 bean 标签生成(反正就是让spring生成并管理单例的对象) 方法2: 把要生成的单例对象类, ...
- jquery的checked以及disabled
下面只提到checked,其实disabled在jquery里的用法和checked是一模一样的 下边两种写法没有任何区别 只是少了些代码而已... ------------------------- ...
- Spring Cloud Netflix Eureka: 多网卡环境下Eureka服务注册IP选择问题
https://blog.csdn.net/neosmith/article/details/53126924 通过源码可以看出,该工具类会获取所有网卡,依次进行遍历,取ip地址合理.索引值最小且不在 ...
- 运用tp5上传图片,并生成缩略图
最近想做个相册,需要用到上传图像,并且考虑到性能问题,还要生成缩略图,就学习下.在网上看了很多大神写的文章,经过各种调试总算出来了,分享下.不好之处,多多指教 ps:运用tp5图片类生成缩略图 ...
- 图形设计必备软件:CorelDRAW
[CorelDRAW 激发创意] CorelDRAW Graphics Suite 是一款领先的图形设计软件,收到数百万专业人士.小型企业主以及全球设计爱好者的热捧.它可以提供无缝的图形.版面.插图. ...
- 2019年 十款Mac上必备的实用软件列表
2019年 十款Mac上必备的实用软件列表 文章来源:风云社区 (www.scoee.com 两千多款Mac软件下载) 1.Parallels Desktop 如果你还是想在Mac上使用Windows ...
- mysql同步复制异常的常见操作-传统复制方式
mysql同步复制异常的常见操作-传统复制方式 一.传统复制方式是基于非gtid的,常见的错误有1032和1062 1032是主键冲突,1062是从库中没有找到对应的记录. 可以查看出现错误的binl ...
- django-rest-framework-jwt
官网文档:http://getblimp.github.io/django-rest-framework-jwt/ GitHub:https://github.com/GetBlimp/django- ...
- Linux top、VIRT、RES、SHR、SWAP(S)、DATA Memory Parameters Detailed
catalog . Linux TOP指令 . VIRT -- Virtual Image (KB) . RES -- Resident size (KB) . SHR -- Shared Memor ...
- SpringBoot笔记十一:html通过Ajax获取后端数据
我们知道在Java Web中,前端的JSP可以使用EL表达式来获取Servlet传过来的数据Spring Boot中也有Thymeleaf模板可以使用th: text="${XXX}&quo ...