#include"iostream"
#include"string"
#include"stdio.h"
#include"queue"
#define INF 0x7fffffff
using namespace std;
typedef struct
{
int next;
int v;
int len;
int height;
}edge;
edge E[20010];
int NE;
int inqueue[10010],dist[10010],head[10010];
inline void Addedge(int from,int to,int len,int height)
{
E[NE].next=head[from];
E[NE].v=to;
E[NE].len=len;
E[NE].height=height;
head[from]=NE++;
}
inline int Relax(int from,int to,int len)
{
if(dist[from]!=INF&&dist[from]+len<dist[to])
{
dist[to]=dist[from]+len;
return 1;
}
return 0;
}
inline int SPFA(int begin,int end,int k)
{
int v,h,i;
for(i=1;i<=10000;i++)
{ inqueue[i]=0; dist[i]=INF;}
queue<int>q;
dist[begin]=0;
inqueue[begin]=1;
q.push(begin);
while(!q.empty())
{
h=q.front();
q.pop();
inqueue[h]=0;
for(i=head[h];i!=-1;i=E[i].next)
{
v=E[i].v;
if(E[i].height>=k)
{
//cout<<"123"<<endl;
if(Relax(h,v,E[i].len)&&!inqueue[v])
{
inqueue[v]=1; q.push(v);
}
}
}
}
if(dist[end]>=INF)
return -1;
else
return dist[end];
}
int main()
{
int test=0,tt=0; int mi,mj,mid;
int R,NV,i,from,to,hh,len,limit_height,distance,begin,end,final_distance;
while(scanf("%d%d",&NV,&R)!=EOF&&(R||NV))
{
if(tt++)
{printf("\n");}
NE=0;
for(i=1;i<=10000;i++)
{ head[i]=-1;}
while(R--)
{
scanf("%d%d%d%d",&from,&to,&hh,&len);
if(hh==-1)
{ Addedge(from,to,len,INF); Addedge(to,from,len,INF);}
else
{Addedge(from,to,len,hh); Addedge(to,from,len,hh);}
}
scanf("%d%d%d",&begin,&end,&limit_height); //我TMD先不用2分枚举
printf("Case %d:\n",++test);
int flag=0;
mi=0; mj=limit_height;
while(mi<=mj)
{
mid=(mi+mj)/2;
distance=SPFA(begin,end,mid);
if(distance==-1)
{ mj=mid-1; }
else
{mi=mid+1; flag=1; final_distance=distance;}
}
if(flag==0)
printf("cannot reach destination\n");
else
{ printf("maximum height = %d\n",mi-1);
printf("length of shortest route = %d\n",final_distance);
}
}
}
HDU 2962 Trucking
最新推荐文章于 2025-12-20 15:00:56 发布
本文介绍了一种改进的最短路径快速算法(SPFA),该算法能够在考虑边的高度限制条件下寻找从起点到终点的最短路径。通过使用队列和松弛操作实现高效的路径搜索,并演示了如何通过调整高度参数来确定可达性和最短距离。
808

被折叠的 条评论
为什么被折叠?



