题目链接: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缩点求最长路)的更多相关文章

  1. BZOJ5450: 轰炸(水题,Tarjan缩点求最长路)

    5450: 轰炸 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 43  Solved:18[Submit][Status][Discuss] Desc ...

  2. Tarjan缩点+Spfa最长路【p3627】[APIO2009] 抢掠计划

    Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri ...

  3. 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路

    题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...

  4. HDU 4612 Warm up tarjan缩环+求最长链

    Warm up Problem Description   N planets are connected by M bidirectional channels that allow instant ...

  5. BZOJ1093 [ZJOI2007]最大半连通子图 【tarjan缩点 + DAG最长路计数】

    题目 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G ...

  6. [luogu3627 APIO2009] 抢掠计划 (tarjan缩点+spfa最长路)

    传送门 Description Input 第一行包含两个整数 N.M.N 表示路口的个数,M 表示道路条数.接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表 ...

  7. 训练赛 Grouping(强连通分量缩点 + DAG求最长路)

    http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=158#problem/F 大致题意:给出n个人和m种关系(ti,si),表示ti ...

  8. POJ-3352 Road Construction,tarjan缩点求边双连通!

    Road Construction 本来不想做这个题,下午总结的时候发现自己花了一周的时间学连通图却连什么是边双连通不清楚,于是百度了一下相关内容,原来就是一个点到另一个至少有两条不同的路. 题意:给 ...

  9. tarjan 缩点 求 scc

    算法学自 BYVoid https://www.byvoid.com/zhs/blog/scc-tarjan/ 这个写得很清楚了 当然 你可能不这么认为 而且 如果是让我 一开始就从这个博客 学 ta ...

随机推荐

  1. Ubuntu的 g++ gcc版本升降级

    更改gcc默认版本(gcc版本降级/升级) ### 以降级到gcc-6为例 >* sudo apt install gcc-6 g++-6 >* sudo update-alternati ...

  2. c#UDP协议

    UDP协议是不可靠的协议,传输速率快 服务器端: using System; using System.Collections.Generic; using System.Linq; using Sy ...

  3. 递归思维判断数组a[N]是否为一个递增数组

    递归的方法:记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束: bool fun( int a[], int n ) { ) { return true; } ) { ] ...

  4. python: 基本知识(二)

    1.set() set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并集等. x = set('hello’) y = set('world') x ---- ...

  5. python各模块组合实例

    # encoding: utf-8 import requests import time from Crypto.Cipher import AES import base64 import has ...

  6. IMDB影评倾向分类 - N-Gram

    catalogue . 数据集 . 模型设计 . 训练 1. 数据集 0x1: IMDB影评数据 本数据库含有来自IMDB的25,000条影评,被标记为正面/负面两种评价 from keras.dat ...

  7. php5.4使用dblib扩展,连接sqlserver中文乱码问题

    在使用php链接sqlserver的时候,查询出来的数据,编码不稳定,一会utf8,一会出现问号.很纠结.下面的方法,可以解决此种问题.前提是dblib扩展. 如果查到的结果是乱码,更改/usr/lo ...

  8. python 面向对象(六)MRO C3算法 super

    ########################总结################ 面向对象回顾 类:对某一个事物的描述,对一些属性和方法的归类 class 类名: var=123#类变量 def ...

  9. css 绝对定位实现水平垂直居中

    负margin实现水平垂直居中 width: 500px; height: 500px; position: absolute; left: 50%; top :50%; margin-left: - ...

  10. 【1】【leetcode-99】 恢复二叉搜索树

    (没思路) 99. 恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2]   1   /  3   \ ...