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;
}
CJOJ 免费航班的更多相关文章
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- Tarjan&2-SAT 总结
\(Tarjan\)&\(2-SAT\) 标签: 知识点总结 安利XZYXZY ps:里面的部分东西来自\(Anson\)和\(yler\)和\(XZY\) 阅读体验:https://zybu ...
- 一些免费的WebService的服务网站
Endpoint: http://fy.webxml.com.cn/webservices/EnglishChinese.asmx Disco: http://fy.webxml.com.cn/web ...
- 免费web api接口大全
下面的接口来自互联网,部分功能需要付费 查询手机 http://www.yodao.com/smartresult-xml/search.s?type=mobile&q=手机号码 查询IP h ...
- 互联网 免费的WebService接口
winform开发暂告于段落,最近再用webservice写接口,接下来的一段时间应该偏向于此方向. (转)一批的免费webservice接口,没有技术含量,只是写在这里做个记忆 股票行情数据 WEB ...
- 免费 web api 接口大全
下面的接口来自互联网,部分功能需要付费 查询手机 http://www.yodao.com/s-martresult-xml/search.s?type=mobile&q= 手机号码 查询 I ...
- 20多个常用的免费WebService接口
20多个常用的免费WebService接口 天气预报Web服务,数据来源于中国气象局 Endpoint Disco WSDL IP地址来源搜索 WEB 服务(是目前最完整的IP地址数据) Endp ...
- [转载]互联网 免费的WebService接口
股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webxml.com.cn/WebServices/St ...
- 一个免费的、跨平台的、开源音频编辑器Audacity
Audacity 是一个免费的开源程序,用于编辑音频录制.它可在多个平台(windows/linux)上运行.Audacity 基于 GUI,是一个具有多种选项的强大程序.它支持您录制各种类型的声音. ...
随机推荐
- TFboy养成记 多层感知器 MLP
内容总结与莫烦的视频. 这里多层感知器代码写的是一个简单的三层神经网络,输入层,隐藏层,输出层.代码的目的是你和一个二次曲线.同时,为了保证数据的自然,添加了mean为0,steddv为0.05的噪声 ...
- MySQL分类表设计--根据ID删除全部子类
在做数据库分类表的时候,通常会有这样的设计:一个字段是ID,另一个字段PID,PID指向自己的上级分类: 这样的设计带来的问题是:我要删除一个类,我希望它的子类全部一起删除: 在不知道分类有多少层级的 ...
- 安卓开源框架SlidingMenu使用
在安卓开发中,会使用很多的开源框架,这篇博文讲的是SlidingMenu--侧边栏 SlidingMenu的是一种比较新的设置界面或配置界面效果,在主界面左滑或者右滑出现设置界面, 能方便的进行各种操 ...
- 为什么要初始化CSS?
因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异. 当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下 ...
- Common Data Service (CDS) 初探
作者:陈希章 发表于 2017年12月16日 前言 Common Data Service(以下简称为CDS),通用数据服务是一个创新性的基础功能,这是微软试图打造一个全新的基于SaaS模式的数据服务 ...
- springboot+thymeleaf(2)
操作步骤 (1)在pom.xml中引入thymeleaf; (2)如何关闭thymeleaf缓存 (3)编写模板文件.html (4)编写访问模板文件controller 1.在pom.xml中引入t ...
- MySQL-Select语句高级应用
1.1 SELECT高级应用 1.1.1 前期准备工作 本次测试使用的是world数据库,由mysql官方提供下载地址: https://dev.mysql.com/doc/index-other.h ...
- MFC控件实现视频“暂停” “播放”循环
问static有什么作用,朗朗上口,可是用起来呢 MFC"按钮"控件实现开始显示"播放",按一下之后就开始播放相关视频,并且按钮显示为"暂停" ...
- Android研究之监听自身应用被卸载代码实现
1.通过jni实现函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 3 ...
- JQuery学习(4-2-phpserver端1)
主要内容:介绍图片的上传过程,涉及PHP跟JQuery: 1. 读取配置文件,连接MySQL数据库. 配置文件主要实username和password. 3-5.php <?php /* * v ...