使用tarjan缩合点。

然后,dfs寻找最长的公路。

水体。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<stack>
using namespace std;
#define maxn 110000
vector<int>old[maxn];
vector<int>vec[maxn];
int dnf[maxn],low[maxn],instack[maxn];
int times,nums;
stack<int>st;
int pan[maxn];
int ru[maxn];
int vis[maxn];
int ans;
int res[maxn];
int val[maxn];
void init(int n)
{for(int i=0;i<=n+1;i++){dnf[i]=low[i]=instack[i]=pan[i]=ru[i]=vis[i]=res[i]=val[i]=0;vec[i].clear();old[i].clear();}while(!st.empty())st.pop();times=nums=1;
}
void tarjan(int x)
{dnf[x]=low[x]=times++;instack[x]=1;st.push(x);for(int i=0;i<old[x].size();i++){int y=old[x][i];if(!dnf[y]){tarjan(y);low[x]=min(low[x],low[y]);}else if(instack[y]){low[x]=min(low[x],dnf[y]);}}if(low[x]==dnf[x]){int y=-1;while(x!=y){y=st.top();st.pop();instack[y]=0;pan[y]=nums;val[nums]++;}nums++;}
}
void dfs(int x)
{if(res[x])return;res[x]=val[x];for(int i=0;i<vec[x].size();i++){int y=vec[x][i];dfs(y);res[x]=max(res[x],res[y]+val[x]);}
}
int main()
{int n,m,x,y;while(~scanf("%d%d",&n,&m)){init(n);while(m--){scanf("%d%d",&x,&y);old[x].push_back(y);}for(int i=1;i<=n;i++)if(!dnf[i])tarjan(i);for(int i=1;i<=n;i++){for(int j=0;j<old[i].size();j++){x=pan[i];y=pan[old[i][j]];if(x==y)continue;vec[x].push_back(y);ru[y]++;}}ans=-1;for(int i=1;i<nums;i++){if(!ru[i]){dfs(i);ans=max(ans,res[i]);}}cout<<ans<<endl;}return 0;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

转载于:https://www.cnblogs.com/zfyouxi/p/4832979.html

zoj-3795-Grouping-tarjan确定最长的公路收缩相关推荐

  1. 【NOJ1596、1597】【贪心算法之最小生成树】最少修建多长的公路能把所有村庄连起来(图示Prim与Kruskal算法)

    1596.最少修建多长的公路能把所有村庄连起来(一) 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 一个地区有n个村庄,有一些村子之间可以修路,已知每条路的长度,问最少修建 ...

  2. vue 段落文字太长(长文收缩)点击展开与收起,查看更多,收起,展开

    vue 段落文字太长点击展开与收起 文章目录 vue 段落文字太长点击展开与收起 效果截图 使用方法 组件被调用demo vue部分 属性说明 组件完整代码 效果截图 使用方法 将组件完整代码复制到你 ...

  3. Conclusion

    /* 高中最后一个暑假 挺有意义的 考了一暑假的试 最后总结一下吧 一天一天来吧7.30 这一天的题有点变态啊 不过难题有难题的做法 T1斗地主 考试的时候打了0分 0分..... 原因好像是读入的格 ...

  4. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  5. BZOJ1924: [Sdoi2010]所驼门王的宝藏

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 1303  Solved: 582 [Submit][S ...

  6. 李彦宏:汽车工业面临无人驾驶百年变局

    https://m.yicai.com/news/100153475.html 4月2日上午,2019互联网岳麓峰会在湖南省长沙市举办,百度创始人.董事长兼CEO李彦宏出席峰会开幕式暨高峰论坛. 李彦 ...

  7. 兰州谋定百合品牌-农业大健康·万祥军:功能性农业产业脱贫

    兰州谋定百合品牌-农业大健康·万祥军:功能性农业产业脱贫 瞿学忠兰州日报首席记者陈玮 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 新闻中国采编网 中国新闻采编网 万赢信 谋定采编经信研究 国研 ...

  8. Python可视化中的Matplotlib(6.散点图以及详细参数、为图形添加文字、注释、箭头以及它们的参数)

    1. 散点图 散点图需要两个参数x,y , 但此时,x不是表示x轴的刻度,而是每个点的横轴坐标! 散点图 scatter() 参数说明: (1) color = 'r': 设置颜色 (2) s = 5 ...

  9. LeetCode 2211. 统计道路上的碰撞次数

    文章目录 1. 题目 2. 解题 1. 题目 在一条无限长的公路上有 n 辆汽车正在行驶.汽车按从左到右的顺序按从 0 到 n - 1 编号,每辆车都在一个 独特的 位置. 给你一个下标从 0 开始的 ...

最新文章

  1. micro-job 0.0.2 发布,分布式任务调度框架
  2. 网站SEO优化值得收藏的技巧介绍
  3. 使用Lucene开发自己的搜索引擎
  4. 网络策略_你知道网络营销策略有哪些吗?
  5. mysql从库故障恢复步骤(删除数据重新同步)
  6. C语言中的“悬空指针”和“野指针”是什么意思?
  7. java holdslock_一种检测Java并发程序代码分支路径lock是否遗漏的方法
  8. 多个字符合并成一个数组_一个excel多个sheet,需要合并为一个sheet
  9. android framework资源,Android 添加framework资源包
  10. Android开发笔记(四十一)Service的生命周期
  11. AI 芯片为何遭遇滑铁卢?
  12. 朋友股票亏惨了,我一怒用Python爬取了证券最新数据
  13. Linux readelf命令
  14. xxl-job 原理:
  15. 光耦的介绍和常用参数
  16. Linux_+_Oracle_11g_R2_RAC_安装配置详细过程
  17. 交互设计、信息图、信息可视化、数据可视化技术资源汇总——设计师的领域,设计师说了算
  18. finalshell连接ubantu
  19. PS2汉化实例-《魔塔大陆》
  20. 第十四届蓝桥杯三月真题刷题训练——第 11 天

热门文章

  1. node.js 搭建blog
  2. 点按钮ajax get方法修改0或1状态封装成函数
  3. CodeForces 508E Arthur and Brackets 贪心
  4. 单独部署activemq-web-console (转载)
  5. 一个功能函数所具备的要素
  6. 正尝试安装的adobe flash player不是最新版本
  7. 使用Hystrix守护应用(3)
  8. MongoDB干货篇之查询数据
  9. 跨平台C++开源码的两种经常使用编译方式
  10. localhost与127.0.0.1的概念和工作原理之不同