bzoj3482,jzoj3238-超时空旅行hiperprostor【最短路,凸包,斜率优化】
生活随笔
收集整理的這篇文章主要介紹了
bzoj3482,jzoj3238-超时空旅行hiperprostor【最短路,凸包,斜率优化】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.lydsy.com/JudgeOnline/problem.php?id=3482
題目大意
一張有向圖有正整數邊權也有xxx邊權。其中xxx可以取任何值(但是要注意所有的xxx邊必須長度相等),每次詢問求SSS到TTT的可能最短路長度個數和它們的和。
解題思路
分層圖,第iii層第jjj個點表示SSS到iii的最短路且經過了jjj條xxx的邊方案,然后跑最短路。
現在我們定義fif_ifi?表示SSS到EEE經過iii條邊xxx邊的最短路,然后設xxx邊的長度為xxx。
那么經過iii條邊為最短路的情況當且僅當fi+i?xf_i+i*xfi?+i?x最小。那么我們可以定義若干條一次函數y=fi+i?xy=f_i+i*xy=fi?+i?x,那么就是一條以fif_ifi?為截距,iii為斜率的線。那么我們考慮y=fi+i?xy=f_i+i*xy=fi?+i?x為最短路的可能情況。
維護一個y=fi+i?xy=f_i+i*xy=fi?+i?x的凸包,維護一個單調隊列,讓剩下的線的兩兩之間的交點的xxx坐標遞增即可。
然后就可以算出第一問,對于第二問用等差數列計算即可。
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #include<queue> #define ll long long #define p(a1,a2) ((a2)*n+a1) using namespace std; const ll N=510,M=10100,inf=1e18; struct node{ll to,next,w; }a[M*2]; struct line{double x,y; }l[N]; ll n,m,ls[N*N],f[N*N],tot,Q,num,ans,next[N]; double ata[N];bool v[N*N]; queue<ll> 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; } ll read() {ll x=0,f=1; char c=getchar();if(c=='x') return -1;while(!isdigit(c)) {if(c=='x')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return (!f)?-1:x; } void spfa(ll s) {memset(v,0,sizeof(v));memset(f,127,sizeof(f));q.push(s);v[s]=1;f[s]=0;while(!q.empty()){ll x=q.front();q.pop();ll c=(x-1)/n;if(c==n) continue;for(ll i=ls[(x-1)%n+1];i;i=a[i].next){ll y=p(a[i].to,c+(a[i].w==-1));if(f[x]+max(a[i].w,0ll)<f[y]){f[y]=f[x]+max(a[i].w,0ll);if(!v[y]){v[y]=1;q.push(y);}}}v[x]=0;}return; } double gtan(double x1,double y1,double x2,double y2) {return (y2-y1)/(x1-x2);} int main() {n=read();m=read();for(ll i=1;i<=m;i++){ll x,y,w;x=read();y=read();w=read();if(x==y) continue;addl(x,y,w);}Q=read();while(Q--){ll s=read(),t=read();bool flag=0;spfa(p(s,0));for(ll i=0;i<=n;i++)if(f[p(t,i)]<inf){flag=1;break;}if(!flag) {printf("0 0\n");continue;}if(f[p(t,0)]>inf) {printf("inf\n");continue;}ll num=0,sum=0,cnt=0;for(ll i=n;i>=0;i--){if(f[p(t,i)]>inf) continue;while(cnt>=1&>an(l[cnt].x,l[cnt].y,i,f[p(t,i)])<=ata[cnt]) cnt--;l[++cnt]=(line){i,f[p(t,i)]};if(cnt>1) ata[cnt]=gtan(l[cnt-1].x,l[cnt-1].y,l[cnt].x,l[cnt].y);}for(ll i=1;i<cnt;i++){ll L=(int)ata[i]+1,R=(int)ata[i+1];if(L<=R) sum+=(ll)(L*l[i].x+l[i].y+R*l[i].x+l[i].y)*(R-L+1)/2;}num=(ll)ata[cnt];if(ata[cnt]!=num||cnt==1) num++,sum+=f[p(t,0)];printf("%lld %lld\n",num,sum);} }總結
以上是生活随笔為你收集整理的bzoj3482,jzoj3238-超时空旅行hiperprostor【最短路,凸包,斜率优化】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马斯克回应波音退出卫星互联网项目:与Sp
- 下一篇: 小鹏汽车内部人士回应 P5 老车主“联名