#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
最新推荐文章于 2024-09-15 11:40:06 发布