zoj3795 Grouping --- 良好的沟通,寻找最长的公路
给定一个图,为了保持图分裂至少成多个集合的集合内可以使点没有直接或间接的关系。
首先,题意可以得到图中可能含有环。该环的内侧是肯定是要被拆卸。
图点降低建DAG画画,能想象。。图从零点渗透深入,在点中的一组相同的水平是不相关,
那么题目所求的问题就转化成求图中最长路的问题了。
这个题的实质和 这题 事实上是一模一样的。
。
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define eps 1e-6
#define ll __int64
#define M 100010//图中点数
using namespace std; int sta[M],top; //Tarjan 算法中的栈
bool vis[M]; //检查是否在栈中
int dfn[M]; //深度优先搜索訪问次序
int low[M]; //能追溯到的最早的次序
int ccnt; //有向图强连通分量个数
int id; //索引號
vector<int> e[M]; //邻接表表示
vector<int> part[M]; //获得强连通分量结果
int inpart[M]; //记录每一个点在第几号强连通分量里
int degree[M]; //记录每一个强连通分量的度
vector<int> edge[M];//缩点后建图
int ans,n,m,dp[M],in[M],point[M]; void tarjan(int x)
{
int i,j;
dfn[x]=low[x]=id++;
vis[x]=1;
sta[++top]=x;
for(i=0;i<e[x].size();i++)
{
j=e[x][i];
if(dfn[j]==-1)
{
tarjan(j);
low[x]=min(low[x],low[j]);
}
else if(vis[j])
low[x]=min(low[x],dfn[j]);
}
if(dfn[x]==low[x])
{
do
{
j=sta[top--];
vis[j]=0;
part[ccnt].push_back(j);
inpart[j]=ccnt;
point[ccnt]++;
}while(j!=x);
ccnt++;
}
} void solve(int n)
{
memset(sta,-1,sizeof sta);
memset(vis,0,sizeof vis);
memset(dfn,-1,sizeof dfn);
memset(low,-1,sizeof low);
memset(point,0,sizeof point); top=ccnt=id=0;
for(int i=1;i<=n;i++)
if(dfn[i]==-1)
tarjan(i);
} int dfs(int x)
{
if(dp[x]) return dp[x];
dp[x]=point[x];
int i;
for(i=0;i<edge[x].size();i++)
{
int tmp=edge[x][i];
dp[x]=max(dp[x],point[x]+dfs(tmp));
}
return dp[x];
} int main()
{
int n,m,i,j,a,b;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<=n;i++)
{
part[i].clear();
e[i].clear();
edge[i].clear();
}
while(m--)
{
scanf("%d%d",&a,&b);
e[a].push_back(b);
}
solve(n);
memset(in,0,sizeof in);
for(i=1;i<=n;i++)//枚举原图中的边
{
for(j=0;j<e[i].size();j++)
{
int a=inpart[i];
int b=inpart[e[i][j]];//
if(a!=b)
{
in[b]++;
edge[a].push_back(b);
}
}
}
ans=0;
memset(dp,0,sizeof dp);
for(i=0;i<ccnt;i++)//点在地图上之后的降低是由0至ccnt数
{
if(!in[i])
ans=max(ans,dfs(i));
}
printf("%d\n",ans);
}
return 0;
}
zoj3795 Grouping --- 良好的沟通,寻找最长的公路的更多相关文章
- zoj-3795-Grouping-tarjan确定最长的公路收缩
使用tarjan缩合点. 然后,dfs寻找最长的公路. 水体. . . #include<stdio.h> #include<string.h> #include<alg ...
- 使用后缀数组寻找最长公共子字符串JavaScript版
后缀数组很久很久以前就出现了,具体的概念读者自行搜索,小菜仅略知一二,不便讨论. 本文通过寻找两个字符串的最长公共子字符串,演示了后缀数组的经典应用. 首先需要说明,小菜实现的这个后缀数组算法,并非标 ...
- 九度oj题目1342:寻找最长合法括号序列II
题目1342:寻找最长合法括号序列II(25分) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:886 解决:361 题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然 ...
- 九度OJ 1337:寻找最长合法括号序列 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:839 解决:179 题目描述: 给你一个长度为N的,由'('和')'组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的 ...
- ZOJ 3795 Grouping (强连通缩点+DP最长路)
<题目链接> 题目大意: n个人,m条关系,每条关系a >= b,说明a,b之间是可比较的,如果还有b >= c,则说明b,c之间,a,c之间都是可以比较的.问至少需要多少个集 ...
- [Jobdu] 题目1337:寻找最长合法括号序列
题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的 ...
- 九度OJ 1342:寻找最长合法括号序列II (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:898 解决:366 题目描述: 假如给你一个由'('和')'组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给 ...
- 九度oj 题目1342:寻找最长合法括号序列II
题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即 ...
- 九度oj 题目1337:寻找最长合法括号序列
题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的 ...
随机推荐
- Java学习笔记九(泛型)
1.介绍 所谓的泛型就是将类型作为一种參数来传递.有了泛型后类型不再是一成不变的.能够通过泛型參数来指定. 能够提供程序开发的灵活性. 2.泛型类或接口的使用 泛型类声明时.与普通类没有太大的差别,仅 ...
- POJ - 1006 Biorhythms 周期相遇 两个思路程序
Description Some people believe that there are three cycles in a person's life that start the day he ...
- adb logcat 命令行用法
作者 :万境绝尘 转载请著名出处 eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. 解析 adb logcat 的帮助信息 在命令行中输入 ...
- 让office2003和office2010共存的方法【转】
前段时间由于工作需要安装office2010,每次打开word都会弹出安装配置界面,反之亦然.于是我在网上找了不少资料.也试了不少方法,终于试用了以下方法得以解决,以下来源于网络. 电脑上同时安装了O ...
- Linux下SSH Session复制
羡慕Windows下secureCRT的Session Copy功能,一直在寻找Linux下类似的软件,殊不知SSH本身就支持此功能. 特别感谢阿干同学的邮件分享. 详细方法 ? 1 2 3 4 Li ...
- 【翻译】Sencha Ext JS 5公布
原文:Announcing Sencha Ext JS 5 简单介绍 我代表Sencha和整个Ext JS团队,非常自豪的宣布,在今天,Sencha Ext JS 5公布了.Ext JS 5已经迈出了 ...
- Swift - 使用atlas图集实现动画效果(SpriteKit游戏开发)
我们通常继承SKSpriteNode来实现游戏中的元素,除了可以使用图片作为纹理皮肤外.我们还可以使用动画纹理集来实现动画播放. 动画纹理集的制作也很简单,首先要有一套动画序列图,然后把它们放到一个文 ...
- Spring MVC RedirectAttributes的用法解决办法
Spring MVC RedirectAttributes的用法很久没发过技术贴了,今天对于一个问题纠结了2小时,遂放弃研究用另一种方法解决,奈何心中一直存在纠结,发帖求解 我先解释下什么是Redir ...
- 以&运行在后台的程序,关闭terminal后,相应进进程自动关闭
以&运行在后台的程序,关闭terminal后,相应进进程自动关闭
- [Android学习笔记]Fragment使用
一.android.app.Fragment 与 android.support.v4.app.Fragment 区别 support.v4.app.Fragment是为了给低版本Android使用的 ...