注意是要求最大化高度(运输量),而不是最小化路径长度。
于是二分高度,判断只走高度不超过\(mid\)的边的情况下,到达终点的最短距离。若不能抵达终点则返回false。
最后输出答案时要先check()出最优解再输出。
const int N=1010;
struct Node
{
int v,h,c;
};
vector<Node> g[N];
int dist[N];
bool vis[N];
int n,m;
int st,ed,maxh;
bool check(int mid)
{
memset(dist,0x3f,sizeof dist);
memset(vis,0,sizeof vis);
priority_queue<PII,vector<PII>,greater<PII> > heap;
heap.push({0,st});
dist[st]=0;
while(heap.size())
{
int t=heap.top().se;
heap.pop();
if(vis[t]) continue;
vis[t]=true;
for(int i=0;i<g[t].size();i++)
{
int j=g[t][i].v,h=g[t][i].h,w=g[t][i].c;
if(h<mid) continue;
if(dist[j]>dist[t]+w)
{
dist[j]=dist[t]+w;
heap.push({dist[j],j});
}
}
}
return dist[ed]==INF?false:true;
}
int main()
{
int kase=1;
while(cin>>n>>m)
{
if(!n && !m) break;
if(kase != 1) cout<<endl;
printf("Case %d:\n",kase++);
for(int i=1;i<=n;i++) g[i].clear();
while(m--)
{
int a,b,h,c;
cin>>a>>b>>h>>c;
if(h == -1) h=INF;
g[a].pb({b,h,c});
g[b].pb({a,h,c});
}
cin>>st>>ed>>maxh;
int l=0,r=maxh;
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
if(l == 0) cout<<"cannot reach destination"<<endl;
else
{
cout<<"maximum height = "<<l<<endl;
check(l);
cout<<"length of shortest route = "<<dist[ed]<<endl;
}
}
//system("pause");
}