1. 程式人生 > >最短路模型-跳樓機-洛谷P3403

最短路模型-跳樓機-洛谷P3403

第一次遇到這種數學題轉化為圖論的題目,與我一開始的想法相同,將其中一個變數與另外兩個變數分離開來,便於處理。由於以前一直認為SPFA會被卡,所以使用了堆優化的Dijkstra,結果超時了,為什麼呢?因為我們構造出來的圖是一張很稀疏的圖,在這種圖上Dijkstra與SPFA比較是比較劣的。由於圖是我們自己構造的,並不是什麼專門用來卡SPFA的網格圖等等,所以可以使用SPFA,一定不會超時。(打破了我不要用SPFA的認識233)

#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,r,l) for(int i=(r);i>=(l);i--)
using namespace std; typedef long long ll; const int N=1e5+10; int x,y,z; int to[N*2],nxt[N*2],w[N*2],head[N],len; ll h,ans,dis[N]; inline void addedge(int a,int b,int ww){ nxt[++len]=head[a]; head[a]=len; to[len]=b; w[len]=ww; } queue<int> q; bool inq[N]; int main(){ cin>>h>>x>>
y>>z; if(x==1){ cout<<h; return 0; } rep(i,0,x-1) addedge(i,(i+y)%x,y),addedge(i,(i+z)%x,z); memset(dis,0x3f,sizeof(dis)); dis[1]=1; q.push(1); inq[1]=true; while(!q.empty()){ int h=q.front(); q.pop(); inq[h]=false; for(int i=head[h];i!=0;i=nxt[i]){ if(dis[h]+w[i]<dis[to[
i]]){ dis[to[i]]=dis[h]+w[i]; if(!inq[to[i]]){ inq[to[i]]=true; q.push(to[i]); } } } } rep(i,0,x-1) if(dis[i]<=h) ans+=(h-dis[i])/x+1; cout<<ans; return 0; }