HDU 2962 Trucking

注意是要求最大化高度(运输量),而不是最小化路径长度。

于是二分高度,判断只走高度不超过\(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");
}
原文地址:https://www.cnblogs.com/fxh0707/p/14164212.html