将塔的高度离散化。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<cmath>
#include<vector>
using namespace std;
const int N=630;
const int inf=599999999;
int n,f,m,q;
int dis[N][N];
map<pair<int,int>,int>myh;
vector<int>edge[N];
int h[N];
int cnt;
int ABS(int x){
return x>=0?x:-x;
}
void init()
{
for(int i=1; i<=n; i++)
{
for(int j=0; j<edge[i].size(); j++)
{
for(int k=j+1; k<edge[i].size(); k++)
{
dis[edge[i][j]][edge[i][k]]=dis[edge[i][k]][edge[i][j]]=ABS(h[edge[i][j]]-h[edge[i][k]]);
}
}
}
}
void floyd()
{
for(int k=1; k<=cnt; k++)
for(int i=1; i<=cnt; i++)
for(int j=1; j<=cnt; j++)
dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
}
int main()
{
int cas;
cin>>cas;
int u,f1,v,f2,w;
int x,y;
pair<int,int>tmp;
while(cas--)
{
cin>>n>>f>>m;
for(int i=1; i<=600; i++)
for(int j=1; j<=600; j++)
{
if(i==j) dis[i][j]=0;
else dis[i][j]=inf;
}
cnt=n;
for(int i=1; i<=n; i++)
{
edge[i].clear();
edge[i].push_back(i);
h[i]=1;
if(i<n)
dis[i][i+1]=dis[i+1][i]=1;
}
dis[n][1]=dis[1][n]=1,h[n]=1;
myh.clear();
for(int i=1; i<=m; i++)
{
cin>>u>>f1>>v>>f2>>w;
tmp=make_pair(u,f1);
if(f1!=1)
{
if(myh[tmp]==0)
{
cnt++;
myh[tmp]=cnt;
h[cnt]=f1;
edge[u].push_back(cnt);
}
x=myh[tmp];
}
else x=u;
tmp=make_pair(v,f2);
if(f2!=1)
{
if(myh[tmp]==0)
{
cnt++;
h[cnt]=f2;
myh[tmp]=cnt;
edge[v].push_back(cnt);
}
y=myh[tmp];
}
else y=v;
dis[x][y]=min(dis[x][y],w);
dis[y][x]=dis[x][y];
}
init();
floyd();
cin>>q;
while(q--)
{
cin>>u>>f1>>v>>f2;
int ans=inf;
if(u==v)ans=ABS(f1-f2);
for(int i=0; i<edge[u].size(); i++)
{
x=edge[u][i];
for(int j=0; j<edge[v].size(); j++)
{
y=edge[v][j];
ans=min(ans,dis[x][y]+ABS(h[x]-f1)+ABS(f2-h[y]));
}
}
cout<<ans<<endl;
}
}
return 0;
}