给定一个图,为了保持图分裂至少成多个集合的集合内可以使点没有直接或间接的关系。

首先,题意可以得到图中可能含有环。该环的内侧是肯定是要被拆卸。

图点降低建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 --- 良好的沟通,寻找最长的公路的更多相关文章

  1. zoj-3795-Grouping-tarjan确定最长的公路收缩

    使用tarjan缩合点. 然后,dfs寻找最长的公路. 水体. . . #include<stdio.h> #include<string.h> #include<alg ...

  2. 使用后缀数组寻找最长公共子字符串JavaScript版

    后缀数组很久很久以前就出现了,具体的概念读者自行搜索,小菜仅略知一二,不便讨论. 本文通过寻找两个字符串的最长公共子字符串,演示了后缀数组的经典应用. 首先需要说明,小菜实现的这个后缀数组算法,并非标 ...

  3. 九度oj题目1342:寻找最长合法括号序列II

    题目1342:寻找最长合法括号序列II(25分) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:886 解决:361 题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然 ...

  4. 九度OJ 1337:寻找最长合法括号序列 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:839 解决:179 题目描述: 给你一个长度为N的,由'('和')'组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的 ...

  5. ZOJ 3795 Grouping (强连通缩点+DP最长路)

    <题目链接> 题目大意: n个人,m条关系,每条关系a >= b,说明a,b之间是可比较的,如果还有b >= c,则说明b,c之间,a,c之间都是可以比较的.问至少需要多少个集 ...

  6. [Jobdu] 题目1337:寻找最长合法括号序列

    题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的 ...

  7. 九度OJ 1342:寻找最长合法括号序列II (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:898 解决:366 题目描述: 假如给你一个由'('和')'组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给 ...

  8. 九度oj 题目1342:寻找最长合法括号序列II

    题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即 ...

  9. 九度oj 题目1337:寻找最长合法括号序列

    题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的 ...

随机推荐

  1. iOS &quot;The sandbox is not in sync with the Podfile.lock&quot;解决方式

    更新Cocoapod之后出现故障: diff: /../Podfile.lock: No such file or directory diff: Manifest.lock: No such fil ...

  2. PHP高级编程SPL

    这几天,我在学习PHP语言中的SPL. 这个东西应该属于PHP中的高级内容,看上去非常复杂,可是非常实用,所以我做了长篇笔记.不然记不住,以后要用的时候,还是要从头学起. 因为这是供自己參考的笔记,不 ...

  3. Determine whether an integer is a palindrome. Do this without extra space.

    看到这个题目的时候,首先不认识 Determine这个单词.英文不好没办法,查了下是确认的意思,然后不懂 palindrome这个单词, 查了下是回文的意思. 问题是 回文是个什么东西,官方解释: A ...

  4. [置顶] Windows Phone后台音乐详解一

    应用于: Windows Phone 8 | Windows PhoneOS 7.1 你可以为winphone编写在后台播放音乐的app.这表示即使当用户点击返回或开始按钮离开你的应用界面时,你的应用 ...

  5. Linq To sql入门练习 Lambda表达式基础

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. Qt 智能指针学习

    原地址:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include & ...

  7. C# 验证识别基类

    原文C# 验证识别基类 网上找了些代码 自己又改了下 先放出来了 处理简单的验证码足够了 001 using System; 002 using System.Collections.Generic; ...

  8. 使用awk和grep做简单的统计

    grep 或 egrep 或awk 过滤两个或多个关键词: grep -E ‘123|abc’ filename // 找出文件(filename)中包含123或者包含abc的行 egrep ‘123 ...

  9. android 实现跳动频谱 DEMO

    package com.terry.AudioFx; import android.app.Activity; import android.content.Context; import andro ...

  10. 理清JavaScript正则表达式

    理清JavaScript正则表达式--下篇 紧接:"理清JavaScript正则表达式--上篇". 正则在String类中的应用 类String支持四种利用正则表达式的方法.分别是 ...