/*
分析:
真稀罕,卓提类系间敢对到10s,真不赖啊~
二分+SPFA,因为有1000与哦点,所以俺系用的SPFA,
至于为啥用二分,就不俺接住所了吧~
156MS,1a~
2012-07-26
*/
分析:
真稀罕,卓提类系间敢对到10s,真不赖啊~
二分+SPFA,因为有1000与哦点,所以俺系用的SPFA,
至于为啥用二分,就不俺接住所了吧~
156MS,1a~
2012-07-26
*/
#include"stdio.h"
#include"string.h"
struct A
{
int dis;
int total;
int mem[111];
int len[111];
int high[111];
}E[1011];
int s,e;
int SPFA(int limit)
{
int queue[2222];
int k,key;
int hash[1011];
int i;
memset(hash,0,sizeof(hash));
k=0;
key=1;
queue[0]=s;
hash[s]=1;
while(k<key)
{
for(i=0;i<E[queue[k]].total;i++)
{
if(E[queue[k]].high[i]<limit && E[queue[k]].high[i]!=-1) continue;
if(E[queue[k]].dis+E[queue[k]].len[i]<E[E[queue[k]].mem[i]].dis)
{
E[E[queue[k]].mem[i]].dis=E[queue[k]].dis+E[queue[k]].len[i];
if(!hash[E[queue[k]].mem[i]])
{
hash[E[queue[k]].mem[i]]=1;
queue[key++]=E[queue[k]].mem[i];
}
}
}
hash[queue[k++]]=0;
}
return E[e].dis;
}
int main()
{
int Case=1;
int n,r;
int i;
int a,b,c,d;
int low,high,mid;
int Limit;
int temp,ans_high,ans_len;
while(scanf("%d%d",&n,&r),n||r)
{
if(Case>1) printf("\n");
for(i=1;i<=n;i++) E[i].total=0;
for(i=0;i<r;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
E[a].mem[E[a].total]=b;
E[a].high[E[a].total]=c;
E[a].len[E[a].total++]=d;
E[b].mem[E[b].total]=a;
E[b].high[E[b].total]=c;
E[b].len[E[b].total++]=d;
}
scanf("%d%d%d",&s,&e,&Limit);
low=0;
high=Limit;
mid=(low+high)>>1;
ans_high=-1;
while(low<=high)
{
for(i=1;i<=n;i++) E[i].dis=11111111;
E[s].dis=0;
temp=SPFA(mid);
if(temp!=11111111)
{
if(mid>ans_high) {ans_high=mid;ans_len=temp;}
low=mid+1;
}
else high=mid-1;
mid=(low+high)>>1;
}
printf("Case %d:\n",Case++);
if(ans_high==-1) printf("cannot reach destination\n");
else
{
printf("maximum height = %d\n",ans_high);
printf("length of shortest route = %d\n",ans_len);
}
}
return 0;
}