hdu 1839 Delay Constrained Maximum Capacity Path 二分下限+最短路spfa

来源:互联网 发布:黑魔棒淘宝 编辑:程序博客网 时间:2024/06/05 12:03

题目链接

题意:给出n个点和m条边,给出每条路的容量和时间。路径的容量为路径上边的容量的最小值。求满足总时间小于T的情况下的最大路径容量。

用二分枚举路径的容量下限,只取容量大于枚举值的边求最短路。若此情况下的最短路小于T,那么更新答案,并提高容量下限。否则减小容量下限。

#include <iostream>#include<cstdio>#include<cstring>#include<cmath>#include<queue>#define N 11000#define M 110000#define INF 0x7ffffffusing namespace std;struct node{    int to,next,w,t;}e[M];int d[N],v[N],T,n,m,cnt,head[N];void add_edge(int u,int v,int w,int t){    e[cnt].to=v;    e[cnt].next=head[u];    e[cnt].w=w;    e[cnt].t=t;    head[u]=cnt++;}int spfa(int w){    for(int i=1;i<=n;i++)   d[i]=INF,v[i]=0;    queue<int> q;    q.push(1);    v[1]=1;    d[1]=0;    while(!q.empty())    {        int c=q.front();        q.pop();        v[c]=0;        for(int i=head[c];i!=-1;i=e[i].next)        {            int u=e[i].to;            if(e[i].w>=w&&d[u]>d[c]+e[i].t)            {                d[u]=d[c]+e[i].t;                if(!v[u])   v[u]=1,q.push(u);            }        }    }    if(d[n]>T)  return 0;    return 1;}int main(){    int c;    cin>>c;    while(c--)    {        cin>>n>>m>>T;        memset(head,-1,sizeof(head));        cnt=0;        int maxw=0;        for(int i=0;i<m;i++)        {            int u,v,w,tt;            scanf("%d%d%d%d",&u,&v,&w,&tt);            add_edge(u,v,w,tt);            add_edge(v,u,w,tt);            maxw=max(maxw,w);        }        int l=0,r=maxw,ans=0;        while(l<=r)        {            int mid=(l+r)/2;            if(spfa(mid))   l=mid+1,ans=mid;            else    r=mid-1;        }        cout<<ans<<endl;    }}

1 0