CJOJ 免费航班

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一遍

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#define RG register
using namespace std;
typedef long long ll;
const int N=20050;
int gi(){
  int x=0;
  char ch=getchar();
  while(ch<‘0‘||ch>‘9‘) ch=getchar();
  while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
  return x;
}
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];
vector<int>q[N],p[N],W[N];
int dis[N][2],vis2[N],fr[N];
void tarjan(int x,int fa){
  dfn[x]=low[x]=++sum;
  for(RG int i=head[x];i;i=nxt[i]){
      int y=to[i];
      if(!dfn[y]){
	  tarjan(y,x);
	  low[x]=min(low[x],low[y]);
	  if(low[y]>dfn[x]) pd[i]=pd[i^1]=1;
	}
      else if(y!=fa) low[x]=min(low[x],dfn[y]);
    }
}
void dfs3(int x,int gg){
  fr[x]=gg,vis[x]=1;
  q[gg].push_back(x);
  for(RG int i=head[x];i;i=nxt[i]){
      if(!pd[i]&&!vis[to[i]]) dfs3(to[i],tot);
    }
}
void dfs1(int x){
    vis2[x]=1;
    for(RG int i=0;i<p[x].size();i++){
	int y=p[x][i],w=W[x][i];
	if(!vis2[y]){
	    dfs1(y);
	    if(dis[y][1]+w>=dis[x][1]){
		dis[x][0]=dis[x][1];
		dis[x][1]=dis[y][1]+w;
	    }
	    else dis[x][0]=max(dis[x][0],dis[y][1]+w);
	}
    }
}
void dfs2(int x){
    vis2[x]=1;
    for(RG int i=0;i<p[x].size();i++){
	int y=p[x][i],w=W[x][i];
	if(!vis2[y]){
	    if(dis[y][1]+w==dis[x][1]){
		dis[y][0]=max(dis[y][0],min(dis[x][1]-w,dis[x][0]+w));
		dis[y][1]=max(dis[x][1]-w,dis[x][0]+w);
	    }
	    else{
		dis[y][0]=max(dis[y][0],max(dis[x][0]+w,min(dis[y][1],dis[x][1]+w)));
		dis[y][1]=max(dis[y][1],dis[x][1]+w);
	    }
	    dfs2(y);
	}
    }
}
int main(){
  int n,m,x,w1,y;
  cnt=1;n=gi(),m=gi();
  for(RG int i=1;i<=m;i++){
      x=gi(),y=gi(),w1=gi();
      to[++cnt]=y,w[cnt]=w1,nxt[cnt]=head[x],head[x]=cnt;
      to[++cnt]=x,w[cnt]=w1,nxt[cnt]=head[y],head[y]=cnt;
    }
  tarjan(1,1);
  for(int i=1;i<=n;i++) if(!vis[i]) dfs3(i,++tot);
  for(RG int i=1;i<=tot;i++)
    for(RG int j=0;j<q[i].size();j++)
      for(RG int k=head[q[i][j]];k;k=nxt[k]){
	  int y=fr[to[k]],w1=w[k];
	  if(y!=i){
	      p[i].push_back(y);
	      W[i].push_back(w1);
	    }
	}
  dfs1(1);for(RG int i=1;i<=tot;i++) vis2[i]=0;
  dfs2(1);for(RG int i=1;i<=n;i++) printf("%d\n",dis[fr[i]][1]);
  return 0;
}
时间: 2024-12-30 04:09:27

CJOJ 免费航班的相关文章

2017 11.6 NOIP模拟赛

1.数学老师的报复(attack.pas/c/cpp)[问题描述]11 班数学大佬 YXN 又在上数学课的时候把班主任 MP6 的错误当众挑出来了,MP6 再一次感到很难堪,于是决定报复 YXNMP6 对 YXN 说:给你一个函数 f(x),定义如下:f ( 1 ) = 1f ( 2 ) = 1f ( n ) = ( A * f ( n - 1 ) + B * f ( n - 2 ) ) mod 7.YXN 说这还不简单,可以秒杀!MP6 微微笑了笑说:n 等于 100 你算得出来,那 n 等于

边双联通分量

(noip模拟赛)化学竞赛的大奖 (prize.pas/c/cpp) [问题描述] XYX 在 CChO(全国化学奥林匹克竞赛)比赛中获得了大奖,奖品是一张特殊的机票.使用这张机票,可以在任意一个国家内的任意城市之间的免费飞行,只有跨国飞行时才会有额外的费用.XYX 获得了一张地图,地图上有城市之间的飞机航班和费用.已知从每个城市出发能到达所有城市,两个城市之间可能有不止一个航班.一个国家内的每两个城市之间一定有不止一条飞行路线, 而两个国家的城市之间只 有一条飞行路线. XYX想知道, 从每个

互联网 免费的WebService接口

winform开发暂告于段落,最近再用webservice写接口,接下来的一段时间应该偏向于此方向. (转)一批的免费webservice接口,没有技术含量,只是写在这里做个记忆 股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询)Endpoint: http://webservice.webxml.com.cn/WebServices/StockInfoWS.asmx 复制 EndpointDisco: http://webservice.webxml.com

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

股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webxml.com.cn/WebServices/StockInfoWS.asmx 复制 Endpoint Disco: http://webservice.webxml.com.cn/WebServices/StockInfoWS.asmx?disco 复制 Disco WSDL: http://webservice.webxml.com.cn/We

免费 web api 接口大全

下面的接口来自互联网,部分功能需要付费 查询手机 http://www.yodao.com/s-martresult-xml/search.s?type=mobile&q= 手机号码 查询 IP http://www.yodao.com/s-martresult-xml/search.s?type=ip&q=IP 地址 查询身份证 http://www.yodao.com/s-martresult-xml/search.s?type=id&q= 身份证号码 快递查询接口 http:

[原创] 关于免费VPN我踩过的那些坑

关于免费VPN我踩过的那些坑 因为工作的关系,笔者经常需要用到VPN, 访问国外国网站,你懂的. 我曾经试着自己购买VPS搭建过VPN, 被封了后就没心情再维护了,毕竟直接买VPN比VPS便宜太多.时间一长,也就有了一些经验. 这里总结成表格的形式,分享给大家: [NydusVPN] 知乎推荐的香港VPN, 比直通车好,线路稳定性好,办公游戏适合.注册前7天内可以无条件退款哦.  官方网站  [Astrill] 老牌VPN,但近两年被封底得太厉害,现在已经不太给力了. 注册第一个月能免费使用(付

集成Android免费语音合成功能(在线、离线、离在线融合)

集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离线)集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离在线融合) 转眼间,大半年没写文章了,没什么理由,就是人变懒了.囧~ 看标题,其实大家都被骗了,有这一篇文章还不够,我其实是打算分3篇文章来写的,如果合在一章里面就太长了,不过现在这个标题党横行的网络世界,我也被污染了,哈.那么为什么要分3篇文章来讲呢?看标题也能猜到了,就是在线.离线.离在线融合这3种语音合成方式,我将分别使

office2016 软件全集 官方下载免费完整版(含破解文件)不含垃圾软件 win10完美激活

office2016官方下载免费完整版是新一代办公软件,office2016官方下载免费完整版已经分享到下面,office2016官方下载免费完整版包括了Word.Excel.PowerPoint.OneNote.Outlook.Skype.Project.Visio以及Publisher等组件和服务.下面分享:office2016软件的下载.安装及激活. 本文来自互联网,按原教程安装结果中招了,因含有垃圾软件,所以决定改写,以免你懂的... 注册文件下载中含有垃圾软件,请按下面的步骤操作会跳过

一直免费,还免蓝点:超能云(SuperVessel)杭州分站盛大开幕, 更多免费资源送你!

为了能更好的支持OpenPOWER的开发者及社区,为了能够支持更多用户在超能云上实现他们的奇思妙想,SuperVessel超能云(http://www.ptopenlab.com)团队经过日夜奋战,推出了超能云-杭州分站. 杭州分站同样基于POWER/OpenPOWER的硬件架构,利用OpenStack技术打造,与北京站采用了同样的技术体制.在业界,超能云第一次利用OpenStack在广域网向用户提供多站点服务. 为了庆祝第一个分站的上线,SuperVessel双站免蓝点使用一周,快来尝鲜吧!尝