SSL2864 【NOIP2013模拟联考15】物语(spfa优化)
2017-12-16 15:59
316 查看
【NOIP2013模拟联考15】物语(monogatari)
Description某一天,少年邂逅了同病相连的IA。见面后,IA一把牵起少年的手,决定和他一起逃离部落,离开这个无法容身的是非之地。
要逃离部落,少年和IA就需要先选择一条耗时最少的路线,从而避免被部落的大人们抓到。部落可以大致分为N个区域,少年和IA在区域1,部落的出口设在区域N。此外部落还有M条连接两个区域道路。道路是无向的,没有一条道路的两端连接相同的区域,也没有两条道路所连接的两个区域完全相同。对于其中前(M−1)条道路,其通过时间是确定的,但最后一条道路,由于地理因素,通过其的时间会不断变化。
现在,少年和IA得知了在K个不同的时段里,通过第M条道路的时间,请您分别计算出在这K 个时段中逃离部落的最少时间,以帮助他们确定行动的时刻。
Input
第一行三个整数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条道路的通过时间。
Output
输出共计K行,每行一个整数,表示对应时段逃离部落的最短时间。如果在该时段内无法逃离,输出“+Inf”。
Sample Input
输入1:
4 5 4
1 2 7
1 3 4
2 4 3
3 4 6
2 3
1
2
4
6
输入2:
4 3 1
1 2 7
1 3 4
2 3
9
Sample Output
输出1:
8
9
10
10
输出2:
+Inf
Data Constraint
分析:分别求出不经过第m条路的最短路dis和经过第m条路但不算第m条路权值的最短路d,然后比较一下dis和d+当前第m条路权值就好了。但是spfa会被卡所以要优化一下。
代码
#include <cstdio> #include <deque> #define ll long long #define N 2000000 #define inf 1e18 using namespace std; struct arr { int to,nxt; ll w; }a ; int ls ,n,m,k,l,s,t; ll dis ,now,d ; bool vis ; deque<int> q; void add(int x,int y,int z) { a[++l].to=y; a[l].w=z; a[l].nxt=ls[x]; ls[x]=l; } void spfa() { for (int i=1;i<=n;i++) { dis[i]=inf; vis[i]=false; } dis[1]=0; while (!q.empty()) q.pop_front(); q.push_front(1); vis[1]=true; while (!q.empty()) { int u=q.front(); vis[u]=false; q.pop_front(); for (int i=ls[u];i;i=a[i].nxt) { int v=a[i].to; if (dis[v]>dis[u]+a[i].w) { dis[v]=dis[u]+a[i].w; if (!vis[v]) { vis[v]=true; if (q.empty()||dis[v]<dis[q.front()]) q.push_front(v); else q.push_back(v); } } } } } void spfa1() { for (int i=1;i<=n;i++) { d[i]=inf; vis[i]=false; } d[1]=0; while (!q.empty()) q.pop_front(); q.push_front(1); vis[1]=true; while (!q.empty()) { int u=q.front(); vis[u]=false; q.pop_front(); for (int i=ls[u];i;i=a[i].nxt) { int v=a[i].to; if ((u==s&&v==t)||(u==t&&v==s)) continue; if (d[v]>d[u]+a[i].w) { d[v]=d[u]+a[i].w; if (!vis[v]) { vis[v]=true; if (q.empty()||d[v]<d[q.front()]) q.push_front(v); else q.push_back(v); } } } } } int main() { freopen("monogatari.in","r",stdin); freopen("monogatari.out","w",stdout); scanf("%d%d%d",&n,&m,&k); for (int i=1;i<m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } scanf("%d%d",&s,&t); add(s,t,0); add(t,s,0); spfa(); spfa1(); for (int i=1;i<=k;i++) { scanf("%lld",&now); ll ans=d ; if (dis +now<d ) ans=dis +now; if (ans==inf) printf("+Inf\n"); else printf("%I64d\n",ans); } fclose(stdin); fclose(stdout); }
相关文章推荐
- [jzoj]3499. 【NOIP2013模拟联考15】人类基因组(genes) (单调队列、前缀和、线段树解一题)
- jzoj3501 【NOIP2013模拟联考15】消息传递(news) 树形dp
- JZOJ3501. 【NOIP2013模拟联考15】消息传递
- 【NOIP2013模拟联考15】人类基因组(genes)
- 【NOIP2013】华容道 最短路优化搜索(spfa)
- JZOJ3455. 【NOIP2013模拟联考3】库特的向量(code)
- jzoj. 3450. 【NOIP2013模拟联考3】山峰(summits)
- 【NOIP2013模拟联考13】线段
- [jzoj]3472. 【NOIP2013模拟联考8】匹配(match)(AC自动机+DP)
- 【NOIP2013模拟联考3】恭介的法则(rule) (Standard IO)
- 【NOIP2013模拟联考2】摘取作物(pick)
- JZOJ 3468. 【NOIP2013模拟联考7】OSU!(osu)
- [jzoj3472]【NOIP2013模拟联考8】匹配(match)
- JZOJsenior3484.【NOIP2013模拟联考10】密码(substring)
- [jzoj]3486. 【NOIP2013模拟联考10】道路改建(rebuild)(缩环+Tarjan+拓扑+bitset记录状态)
- [jzoj]3479. 【NOIP2013模拟联考9】工作安排(work)
- JZOJsenior3488.【NOIP2013模拟联考11】矩形(rect)
- 【NOIP2013模拟联考14】图形变换(transform)
- 【NOIP2013模拟联考14】图形变换(transform)
- [jzoj]3468. 【NOIP2013模拟联考7】OSU!(osu) (期望DP)