Description

小Z在MOI比赛中获得了大奖,奖品是一张特殊的机 票。使用这张机票,可以在任意一个国家内的任意城市之间的免费飞行,只有跨国飞行时才会有额外的费用。小Z获得了一张地图,地图上有城市之间的飞机航班和 费用。已知从每个城市出发能到达所有城市,两个城市之间可能有不止一个航班。一个国家内的每两个城市之间一定有不止一条飞行路线,而两个国家的城市之间只 有一条飞行路线。小Z想知道,从每个城市出发到额外费用最大的城市,以便估算出出行的费用,请你帮助他。当然,你不能通过乘坐多次一个航班增加额外费用, 也就是必须沿费用最少的路线飞行。

Input

第一行,两个整数N,M,表示地图上有N个城市,M条航线。
接下来M行,每行三个整数a,b,c,表示城市a,b之间有一条费用为c的航线。

Output

共N行,第i行为从城市i出发到达每个城市额外费用的最大值。

Sample Input

6 6
1 4 2
1 2 6
2 5 3
2 3 7
6 3 4
3 1 8

Sample Output

4
4
4
6
7
7

Hint

样例说明
有四个国家,包含的城市分别为 {1,2,3},{4},{5},{6}。从城市1出发到达城市6,乘坐(1,3)(3,6)两个航班费用最大,(1,3)在国内为免费航班,(3,6)的费用为4,所以从1出发的最大费用为4。

数据规模
对于30%的数据 1<=N<=1000,1<=M<=1000
对于100%的数据 1<=N<=20000,1<=M<=200000

Source

动态规划 ,连通性

根据题目描述,每个国家是一个边双连通分量,把每个边双连通分量缩点后,原图变为一棵树.

相当于是求树上每个点在树上的最长路.

所有点的树上最长路可以通过两边dfs进行DP;

第一遍:求出每个点只到他子树内部的最长路和次长路

第二遍:每个点再由他父亲来更新往改点的子树外走的最长路,因为该点到子树外面的路必经过他爸爸

具体实现就是最长路和次长路转化,转移画画图就好了

边双连通缩点的话就是把桥标记后在dfs一遍

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<vector>
  6. #define RG register
  7. using namespace std;
  8. typedef long long ll;
  9. const int N=20050;
  10. int gi(){
  11. int x=0;
  12. char ch=getchar();
  13. while(ch<'0'||ch>'9') ch=getchar();
  14. while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
  15. return x;
  16. }
  17. int head[N],nxt[N*20],to[N*20],dfn[N],low[N],vis[N],zhan[N],w[N*20],cnt=1,tot,sum,top,pd[N*20];
  18. vector<int>q[N],p[N],W[N];
  19. int dis[N][2],vis2[N],fr[N];
  20. void tarjan(int x,int fa){
  21. dfn[x]=low[x]=++sum;
  22. for(RG int i=head[x];i;i=nxt[i]){
  23. int y=to[i];
  24. if(!dfn[y]){
  25. tarjan(y,x);
  26. low[x]=min(low[x],low[y]);
  27. if(low[y]>dfn[x]) pd[i]=pd[i^1]=1;
  28. }
  29. else if(y!=fa) low[x]=min(low[x],dfn[y]);
  30. }
  31. }
  32. void dfs3(int x,int gg){
  33. fr[x]=gg,vis[x]=1;
  34. q[gg].push_back(x);
  35. for(RG int i=head[x];i;i=nxt[i]){
  36. if(!pd[i]&&!vis[to[i]]) dfs3(to[i],tot);
  37. }
  38. }
  39. void dfs1(int x){
  40. vis2[x]=1;
  41. for(RG int i=0;i<p[x].size();i++){
  42. int y=p[x][i],w=W[x][i];
  43. if(!vis2[y]){
  44. dfs1(y);
  45. if(dis[y][1]+w>=dis[x][1]){
  46. dis[x][0]=dis[x][1];
  47. dis[x][1]=dis[y][1]+w;
  48. }
  49. else dis[x][0]=max(dis[x][0],dis[y][1]+w);
  50. }
  51. }
  52. }
  53. void dfs2(int x){
  54. vis2[x]=1;
  55. for(RG int i=0;i<p[x].size();i++){
  56. int y=p[x][i],w=W[x][i];
  57. if(!vis2[y]){
  58. if(dis[y][1]+w==dis[x][1]){
  59. dis[y][0]=max(dis[y][0],min(dis[x][1]-w,dis[x][0]+w));
  60. dis[y][1]=max(dis[x][1]-w,dis[x][0]+w);
  61. }
  62. else{
  63. dis[y][0]=max(dis[y][0],max(dis[x][0]+w,min(dis[y][1],dis[x][1]+w)));
  64. dis[y][1]=max(dis[y][1],dis[x][1]+w);
  65. }
  66. dfs2(y);
  67. }
  68. }
  69. }
  70. int main(){
  71. int n,m,x,w1,y;
  72. cnt=1;n=gi(),m=gi();
  73. for(RG int i=1;i<=m;i++){
  74. x=gi(),y=gi(),w1=gi();
  75. to[++cnt]=y,w[cnt]=w1,nxt[cnt]=head[x],head[x]=cnt;
  76. to[++cnt]=x,w[cnt]=w1,nxt[cnt]=head[y],head[y]=cnt;
  77. }
  78. tarjan(1,1);
  79. for(int i=1;i<=n;i++) if(!vis[i]) dfs3(i,++tot);
  80. for(RG int i=1;i<=tot;i++)
  81. for(RG int j=0;j<q[i].size();j++)
  82. for(RG int k=head[q[i][j]];k;k=nxt[k]){
  83. int y=fr[to[k]],w1=w[k];
  84. if(y!=i){
  85. p[i].push_back(y);
  86. W[i].push_back(w1);
  87. }
  88. }
  89. dfs1(1);for(RG int i=1;i<=tot;i++) vis2[i]=0;
  90. dfs2(1);for(RG int i=1;i<=n;i++) printf("%d\n",dis[fr[i]][1]);
  91. return 0;
  92. }

CJOJ 免费航班的更多相关文章

  1. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  2. Tarjan&2-SAT 总结

    \(Tarjan\)&\(2-SAT\) 标签: 知识点总结 安利XZYXZY ps:里面的部分东西来自\(Anson\)和\(yler\)和\(XZY\) 阅读体验:https://zybu ...

  3. 一些免费的WebService的服务网站

    Endpoint: http://fy.webxml.com.cn/webservices/EnglishChinese.asmx Disco: http://fy.webxml.com.cn/web ...

  4. 免费web api接口大全

    下面的接口来自互联网,部分功能需要付费 查询手机 http://www.yodao.com/smartresult-xml/search.s?type=mobile&q=手机号码 查询IP h ...

  5. 互联网 免费的WebService接口

    winform开发暂告于段落,最近再用webservice写接口,接下来的一段时间应该偏向于此方向. (转)一批的免费webservice接口,没有技术含量,只是写在这里做个记忆 股票行情数据 WEB ...

  6. 免费 web api 接口大全

    下面的接口来自互联网,部分功能需要付费 查询手机 http://www.yodao.com/s-martresult-xml/search.s?type=mobile&q= 手机号码 查询 I ...

  7. 20多个常用的免费WebService接口

    20多个常用的免费WebService接口 天气预报Web服务,数据来源于中国气象局 Endpoint  Disco  WSDL IP地址来源搜索 WEB 服务(是目前最完整的IP地址数据) Endp ...

  8. [转载]互联网 免费的WebService接口

    股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webxml.com.cn/WebServices/St ...

  9. 一个免费的、跨平台的、开源音频编辑器Audacity

    Audacity 是一个免费的开源程序,用于编辑音频录制.它可在多个平台(windows/linux)上运行.Audacity 基于 GUI,是一个具有多种选项的强大程序.它支持您录制各种类型的声音. ...

随机推荐

  1. (转载)java 枚举 循环遍历以及一些简单常见的使用

    本文转载自:http://blog.csdn.net/qq_27093465/article/details/51706076 作者:李学凯 什么时候想用枚举类型: 有时候,在设计一个java mod ...

  2. 拓扑排序&关键路径

    拓扑排序:AOV网 概念 example:选课问题:AOV网 顶点活动(Activity On Vertex)网是指用顶点表示活动,而用边集表示活动关系的有向图. 在这个例子中,课程为结点,而有向边表 ...

  3. 基于git的代码版本管理规范及流程-简版

    基于git的简单实用的版本管理规范及流程,包括:代码库的分布.人员角色的划分.代码提交合并流程.代码冲突处理.分支管理. 代码库分类 根据代码库分布的位置及作用,分为以下几类: 主库:位于服务端,所有 ...

  4. hdu 3183 A Magic Lamp RMQ ST 坐标最小值

    hdu 3183 A Magic Lamp RMQ ST 坐标最小值 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题目大意: 从给定的串中挑 ...

  5. linux内核模块编程实例

    linux内核模块编程实例 学号:201400814125 班级:计科141 姓名:刘建伟 1.确定本机虚拟机中的Ubuntu下Linux的版本 通过使用命令uname -a/uname -r/una ...

  6. CCF-201512-2-消除类游戏

    问题描述 试题编号: 201512-2 试题名称: 消除类游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游 ...

  7. 关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案

    在win7,win10,vs2015,vs2017之间折腾了两天,死活就是调不出来Mysql数据源.真是活见鬼了. 直接说方案吧. 一,卸载你所安装过的mysql-connector-net.mysq ...

  8. 基于TCP协议的socket编程

    什么是socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...

  9. 打开和创建SqlCe(.sdf文件)

    打开SqlCe的工具有些少,目前能看到Vs2010安装插件之后打开.sdf文件 [转载]https://weblogs.asp.net/scottgu/vs-2010-sp1-and-sql-ce 需 ...

  10. zeppelin0.7.3源码编译

    操作系统: Centos7.X Python版本: Python2.7 Maven版本:3.1.* Git:1.8.3.* JAVA:java1.7+ node npm bower grunt 每次执 ...