您的位置:首页 > 大数据 > 人工智能

HDU 1839 Delay Constrained Maximum Capacity Path (二分最短路)

2017-04-06 14:46 399 查看
题意:

给出1-》n 个城市以及m条边,每条边有通过的时间w,以及容量d,询问在t时间内可以最多运输容量为多少的矿  从1->n。且只能选择一条路走(多条路就成流了!)

思路:

二分枚举当前路径容量,作为最大的容量,只有d>=当前的容量的路才可以通过

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
const int maxn=100005;
int res;
struct node
{
int v,w,dis,d;
node(int _v=0,int _w=0,int _dis=0,int _d=0):v(_v),w(_w),dis(_dis),d(_d){}
bool operator <(const node &r)const
{
if(dis!=r.dis)
return dis>r.dis;
else
return w>r.w;
}
};
vector<node> vec[maxn];///存边
int vis[maxn];
int cap[maxn];
int dis[maxn];///存最短路径
const int inf=0x3f3f3f3f;
int n,m,c;
int dij(int c)
{
for(int i=1;i<=n;i++)
{
vis[i]=0;
dis[i]=inf;
}
priority_queue<node> q;
dis[1]=0;
q.push(node(1,0,0,0));
node tmp;
while(!q.empty())
{
tmp=q.top();
q.pop();
int u=tmp.v;
if(vis[u])
continue;
vis[u]=1;
for(int i=0;i<vec[u].size();i++)
{

int v=vec[u][i].v;
int cost=vec[u][i].w;
int voc=vec[u][i].d;
if(!vis[v]&&dis[v]>=dis[u]+cost&&voc>=c)
{
dis[v]=dis[u]+cost;
q.push(node( v,cost,dis[v],0 ));
}
}
}
if(dis
<=res)
return 1;
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{

scanf("%d%d%d",&n,&m,&res);
for(int i=1;i<=n;i++)
vec[i].clear();

for(int i=1;i<=m;i++)
{

int u,v,w,d;
scanf("%d%d%d%d",&u,&v,&d,&w );
vec[u].push_back(node(v,w,0,d));
vec[v].push_back(node(u,w,0,d));
cap[i]=d;
}
sort(cap+1,cap+1+m);
int l=1,r=m,mid,ans;
while(l<=r)
{
int mid=(l+r)/2;
if( dij(cap[mid]) )
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
printf("%d\n",cap[ans] );
}
}
/*
1
4 4 20
1 2 1000 15
3 4 102 5
1 3 101 15
3 4 100 4
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: