最短路模型-跳樓機-洛谷P3403
阿新 • • 發佈:2018-12-19
第一次遇到這種數學題轉化為圖論的題目,與我一開始的想法相同,將其中一個變數與另外兩個變數分離開來,便於處理。由於以前一直認為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;
}