物语--解题报告
来源:互联网 发布:罗氏lc480软件安装 编辑:程序博客网 时间:2024/04/30 06:52
【问题描述】
某一天,少年邂逅了同病相连的IA。见面后,IA一把牵起少年的手,决定和他一起逃离部落,离开这个无法容身的是非之地。
要逃离部落,少年和IA就需要先选择一条耗时最少的路线,从而避免被部落的大人们抓到。部落可以大致分为N个区域,少年和IA在区域1,部落的出口设在区域N。此外部落还有M条连接两个区域道路。道路是无向的,没有一条道路的两端连接相同的区域,也没有两条道路所连接的两个区域完全相同。对于其中前(M-1)条道路,其通过时间是确定的,但最后一条道路,由于地理因素,通过其的时间会不断变化。
现在,少年和IA得知了在K个不同的时段里,通过第M条道路的时间,请您分别计算出在这K个时段中逃离部落的最少时间,以帮助他们确定行动的时刻。
【输入格式】
第一行三个整数N,M,K,分别表示区域数,道路数,询问数。
接下来M-1行每行三个整数ui,vi,wi(ui≠vi,1≤ui,vi≤N,0<wi≤10^9),表示这条道路连接的区域和通过时间。
紧接着是两个整数ui,vi(ui≠vi,1≤ui,vi≤N),表示第M条道路连接的区域。
最后K行,每行一个正整数xi(0<xi≤10^9),表示目前第M条道路的通过时间。
【输出格式】
输出共计K行,每行一个整数,表示对应时段逃离部落的最短时间。如果在该时段内无法逃离,输出“+Inf”。
【样例输入1】
4 5 4
1 2 7
1 3 4
2 4 3
3 4 6
2 3
1
2
4
6
【样例输出1】
8
9
10
10
【样例说明1】
如图1,红色的圆圈表示少年和IA的出发地,绿色的圆圈表示目的地,连线表示道路,旁边的数字表示通过该道路的时间。最后一条道路时间未知用x表示。图中不重复经过同一区域的路径有4条,分别为1→2→4,1→3→4,1→2→3→4,1→3→2→4,其所需时间随x的关系如下表所示:
可以证明,不存在更优的解,故将上表最后一列输出。
【样例输入2】
4 3 1
1 2 7
1 3 4
2 3
9
【样例输出2】
+Inf
【样例说明2】
如图2,起点和终点不连通,故少年和IA无法逃离部落。
【数据范围】
测试点编号
N
M
K
其他
1
N = 2
M = 1
K = 1
随机生成
2
N = 5
M = 4
K = 1
随机生成
3
N = 5
M = 10
K = 5
随机生成
4
N = 50
M = 100
K = 10
随机生成
5
N = 75
M = 200
K = 10
随机生成
6
N = 100
M = 1000
K = 10
随机生成
7
N = 200
M = 2000
K = 10
随机生成
8
N = 300
M = 3000
K = 10
随机生成
9
N = 1000
M = 30 000
K = 10
随机生成
10
N = 2000
M = 50 000
K = 10
随机生成
11
N = 10 000
M = 200 000
K = 10
随机生成
12
N = 30 000
M = 300 000
K = 10
随机生成
13
N = 50 000
M = 300 000
K = 30 000
随机生成
14
N = 100 000
M = 500 000
K = 30 000
随机生成
15
N = 100 000
M = 500 000
K = 30 000
随机生成
16
N = 120 000
M = 179 998
K = 10
N/A
17
N = 180 000
M = 299 997
K = 10
N/A
18
N = 180 000
M = 269 998
K = 10
N/A
19
N = 180 000
M = 419 991
K = 30 000
N/A
20
N = 200 000
M = 399 996
K = 30 000
N/A
【题解】
首先把第M个边去掉求最短路,分别求出1到任何一个点的最短路,以及任何一个点到N的最短路(反向spfa)。
然后当第M个边(S,T)的长度变化的时候,只需要比较dis[1][S]+bian[S][T]+dis[T][N],dis[1][N]即可。
代码附上
#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#include<ctime>#include<queue>#define MAXN 200005#define MAXM 500005#define INF 4611686010000000000LL#define pr pair<LL, int>#define mp make_pair#define x first#define y secondusing namespace std ;typedef long long LL ;struct road{int x, next ;LL dis ;} r[MAXM*2] ;int n,m,k;int ST,ED;LL S[MAXN],T[MAXN];int st[MAXN],w,vis[MAXN] ;priority_queue<pr>q;void add(int x,int y,LL dis){r[++w].x=y;r[w].next=st[x] ;r[w].dis=dis;st[x]=w ;}void spfa(int x){int tmp;LL now;for(int i=1;i<=n;i++) T[i] = INF ;T[x]=0;q.push(mp(0,x)) ;while(!q.empty()){x=q.top().y;now=q.top().x;q.pop() ;if(-now>T[x])continue ;now=-now ;for(int i=st[x];i;i=r[i].next)if(T[tmp=r[i].x]>T[x]+r[i].dis){T[tmp]=T[x]+r[i].dis ;q.push(mp(-T[tmp],tmp)) ;}}}int main(){int fr,to;LL dt,tmp;scanf("%d%d%d",&n,&m,&k) ;for(int i=1,tmp=0;i<m;i++){scanf("%d%d%I64d",&fr,&to,&dt) ;tmp+=dt;add(fr,to,dt),add(to,fr,dt) ;}scanf("%d%d",&ST,&ED);spfa(1);//正向 memcpy(S,T,sizeof(S)) ;spfa(n);//反向 for(int i=1;i<=k;i++){scanf("%I64d",&dt) ;tmp=min(S[n],min(S[ST]+T[ED],S[ED]+T[ST])+dt);if(tmp==INF) printf("+Inf\n") ;else printf("%I64d\n", tmp) ;}}
- 物语--解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- Antiprime解题报告
- expr解题报告
- 华容道解题报告
- tju解题报告
- zju1062/pku1095解题报告
- UsacoGate解题报告 --- 序曲
- ZJU 2060 解题报告
- ZJU 1331 解题报告
- ZJU 1115 解题报告
- ZJU1057解题报告
- 3.6 mxc_v4l_ioctl函数分析
- SQLServer创建表,插入数据,查询,创建触发器,存储过程
- 用Jersey开发RESTful服务
- BZOJ1042【HAOI2008】硬币购物(DP+容斥原理)
- googlePlay 内购测试
- 物语--解题报告
- 详解 Spring 3.0 基于 Annotation 的依赖注入实现
- 改良后的 清除日志文件脚本
- AngularJs ngClass、ngClassEven、ngClassOdd、ngStyle
- GLSurfaceView渲染过程详解
- ETag详解
- 通过案例对SparkStreaming透彻理解(1)
- Application.mk
- vs2010增加新菜单