jzoj3500-物语【最短路】
生活随笔
收集整理的這篇文章主要介紹了
jzoj3500-物语【最短路】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正題
題目鏈接:https://jzoj.net/senior/#contest/show/3005/0
題目大意
nnn個點mmm條邊的無向圖,有一條邊的邊權會變化,qqq次變化,每次詢問最短路。
解題思路
可變邊(x,y)(x,y)(x,y)
路徑無非就三種
111和nnn都跑一次最短路就好了。
codecodecode
#pragma GCC optimize(2) %:pragma GCC optimize(3) %:pragma GCC optimize("Ofast") %:pragma GCC optimize("inline") #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cctype> #define ll long long using namespace std; const ll N=5e5+10; struct edge_node{ll to,next,w; }a[N*2]; struct node{ll pos,dis; }; bool operator<(node x,node y) {return x.dis>y.dis;} ll read() {ll x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f; } ll n,m,Q,f1[N],f2[N],ls[N],s,t,tot; bool v[N]; priority_queue<node> q; void addl(ll x,ll y,ll w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;return; } void dij(ll s,ll *f){memset(v,0,sizeof(v));q.push((node){s,0});f[s]=0;while(!q.empty()){ll x=q.top().pos;q.pop();if(v[x]) continue;v[x]=1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(f[x]+a[i].w<f[y]){f[y]=f[x]+a[i].w;if(!v[y])q.push((node){y,f[y]});}}}return; } int main() {freopen("monogatari.in","r",stdin);freopen("monogatari.out","w",stdout);n=read();m=read();Q=read();for(int i=1;i<=n;i++)f1[i]=f2[i]=1e18;for(ll i=1;i<m;i++){ll x=read(),y=read(),w=read();addl(x,y,w);addl(y,x,w);}dij(1,f1);dij(n,f2);s=read();t=read();while(Q--){ll w=read(),ans=f1[n];ans=min(min(f1[s]+f2[t]+w,f1[t]+f2[s]+w),ans);if(ans>=1e18) printf("+Inf\n");else printf("%lld\n",ans);} }總結(jié)
以上是生活随笔為你收集整理的jzoj3500-物语【最短路】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 康佳电视怎么样安装软件看电视直播 两种方
- 下一篇: jzoj3501-消息传递【换根法,树形