实在不敢相信,这题居然是绿的 (一个离散建图就该是蓝的了吧) 加上感人的题意 以及70多行的代码……
#include<algorithm>
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<map>
#include<set>
#define int long long
using namespace std;
const int maxn=105;
int end,speed,n;
int shu1[maxn],shu2[maxn];
int dp[maxn][maxn];
int ans;
map<int,int> mp;
int cun[maxn],tot,num;
set<int> dui;
int get(int x,int y)
{
if(x==y)return 0;
if(dui.count(x))return 1<<30;
int k=y;
for(int i=1;i<=n;i++)
if(x<shu1[i]&&shu1[i]<k&&(shu1[i]-x)%speed==0)
k=shu1[i];
while(k!=y&&dui.count(k))k--;
if(k==x)return 1<<30;
return get(k,y)+(k-x+speed-1)/speed;
}
main()
{
while(true)
{
cin>>end;
if(!end)return 0;
cin>>speed>>n;
num=tot=0;
cun[++tot]=0,cun[++tot]=end;
mp.clear(),dui.clear();
memset(shu1,0,sizeof(shu1));
memset(shu2,0,sizeof(shu2));
for(int i=1;i<=n;i++)
{
cin>>shu1[i]>>shu2[i];
cun[++tot]=shu1[i],cun[++tot]=shu2[i];
dui.insert(shu1[i]);
}
sort(cun+1,cun+1+tot);
for(int i=1;i<=tot;i++)
if(!mp[cun[i]])
mp[cun[i]]=++num;
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=tot;i++)
for(int j=i+1;j<=tot;j++)
{
int x=cun[i],y=cun[j];
dp[mp[x]][mp[y]]=get(x,y);
// cout<<get(x,y)<<" "<<x<<" "<<y<<"xy\n";
}
for(int i=1;i<=n;i++)
dp[mp[shu1[i]]][mp[shu2[i]]]=0;
// for(int i=1;i<=num;i++)dp[i][i]=0;
// for(int i=1;i<=num;i++)
// for(int j=1;j<=num;j++)
// cout<<dp[i][j]<<" "<<i<<" "<<j<<"dp\n";
for(int k=1;k<=num;k++)
for(int i=1;i<=num;i++)
for(int j=1;j<=num;j++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
end=mp[end];
ans=dp[1][end];
cout<<ans<<"\n";
}
}