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

链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1839

题目:

Delay Constrained Maximum Capacity Path
Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 226    Accepted Submission(s): 98

Problem Description
Consider an undirected graph with N vertices, numbered from 1 to N, and M edges. The vertex numbered with 1 corresponds to a mine from where some precious minerals are extracted. The vertex numbered with N corresponds to a minerals processing factory. Each edge has an associated travel time (in time units) and capacity (in units of minerals). It has been decided that the minerals which are extracted from the mine will be delivered to the factory using a single path. This path should have the highest capacity possible, in order to be able to transport simultaneously as many units of minerals as possible. The capacity of a path is equal to the smallest capacity of any of its edges. However, the minerals are very sensitive and, once extracted from the mine, they will start decomposing after T time units, unless they reach the factory within this time interval. Therefore, the total travel time of the chosen path (the sum of the travel times of its edges) should be less or equal to T.

Input
The first line of input contains an integer number X, representing the number of test cases to follow. The first line of each test case contains 3 integer numbers, separated by blanks: N (2 <= N <= 10.000), M (1 <= M <= 50.000) and T (1 <= T <= 500.000). Each of the next M lines will contain four integer numbers each, separated by blanks: A, B, C and D, meaning that there is an edge between vertices A and B, having capacity C (1 <= C <= 2.000.000.000) and the travel time D (1 <= D <= 50.000). A and B are different integers between 1 and N. There will exist at most one edge between any two vertices.

Output
For each of the X test cases, in the order given in the input, print one line containing the highest capacity of a path from the mine to the factory, considering the travel time constraint. There will always exist at least one path between the mine and the factory obbeying the travel time constraint.

Sample Input

2
2 1 10
1 2 13 10
4 4 20
1 2 1000 15
2 4 999 6
1 3 100 15
3 4 99 4

Sample Output

13
99

题目大意:
有N个点,点1为珍贵矿物的采矿区, 点N为加工厂,有M条双向连通的边连接这些点。走每条边的运输容量为C,运送时间为D。
他们要选择一条从1到N的路径运输, 这条路径的运输总时间要在T之内,在这个前提之下,要让这条路径的运输容量尽可能地大。
一条路径的运输容量取决与这条路径中的运输容量最小的那条边。

分析与总结:
因为每条路径的容量取决于这条路径中所有边中的最小容量,所以我们可以以此枚举最小容量。

但是如果一个一个容量的枚举,那明显效率太低了。

通过分析,可以看出,如果最低容量越大,那么符合要求的路径就越少,所以,根据容量的大小,路径数量是单调的。

有了单调性,就可以利用二分法了。

只要把容量从大到小进行排序,然后二分之,很快便能算出答案。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;  

const int INF = 0x7fffffff;
const int VN  =  10005;
const int EN  =  50005;  

struct Edge{int v,next,cap,time;}E[EN*2];  

int n, m, t;
int size;
int head[VN];
int cap[EN];
int d[VN];
int Time[VN];
int limit;
bool inq[VN];  

void init(){
    size=0;
    memset(head, -1, sizeof(head));
}
void addEdge(int u,int v,int c,int d){
    E[size].v=v;
    E[size].cap=c;
    E[size].time=d;
    E[size].next = head[u];
    head[u] = size++;
}
int Dijkstra(int src){
    memset(inq, 0, sizeof(inq));
    for(int i=1; i<=n; ++i)d[i]=INF;
    d[src] = 0;
    queue<int>q;
    q.push(src);
    while(!q.empty()){
        int u = q.front(); q.pop();
        inq[u] = false;
        for(int e=head[u]; e!=-1; e=E[e].next)if(E[e].cap>=limit){
            int tmp = d[u]+E[e].time;
            if(d[E[e].v] > tmp){
                d[E[e].v] = tmp;
                if(!inq[E[e].v]){
                    inq[E[e].v] = true;
                    q.push(E[e].v);
                }
            }
        }
    }
    return d[n];
}  

int main(){
    int T, u, v, c, d;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&n,&m,&t);
        init();
        for(int i=0; i<m; ++i){
            scanf("%d%d%d%d",&u,&v,&c,&d);
            cap[i]=c;
            addEdge(u,v,c,d);
            addEdge(v,u,c,d);
        }
        sort(cap, cap+m,greater<int>());
        // 二分求解
        int left=0, right=m-1, mid;
        while(left<right){
            mid = (left+right)>>1;
            limit = cap[mid];
            int tmp=Dijkstra(1);
            if(tmp==INF || tmp>t){
                left = mid+1;
            }
            else{
                right=mid;
            }
        }
        printf("%d\n", cap[left]);
    }
    return 0;
}

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索time
, to
, Factory
, of
The
maximum capacity、maximum ap capacity、constrained、constrained true、be constrained to,以便于您获取更多的相关知识。

时间: 2024-10-25 20:21:01

HDU 1839 Delay Constrained Maximum Capacity Path(二分+最短路)的相关文章

hdu 1839 Delay Constrained Maximum Capacity Path

点击打开链接hdu 1839 思路:最短路+SPFA+二分查找 分析: 1 题目要求的是在限制时间t之内,最大的容量.而题目说了最大的容量就是路径上的最小的边值. 2 这里加了一个容量,而且是要求一条边的最短.所以这里用到了二分,因为我们知道随着边长的增大能够满足的路径越来越少,所以我们只要去枚举容量即可. 代码: #include<iostream> #include<algorithm> #include<cstdio> #include<cstring>

HDU 2807 The Shortest Path:最短路+矩阵快速比较

链接: http://acm.hdu.edu.cn/showproblem.php?pid=2807 题目: The Shortest Path Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1421    Accepted Submission(s): 436 Problem Description There are N citi

算法:hdu 3586 Information Disturbing(树形dp + 二分)

题意 给一棵n个节点的树,节点编号为1-n,根节点为1.每条边有权值,砍掉一条边要花费cost(w) 要砍掉一些边, 使得每个叶子节点无法走到根节点. 要求砍掉花费总和不能超过m的情况下,让每条 边花费上限尽量低 思路 二分可以砍的边的权值上限,然后树形dp f[i]: 表示让i子树所有的叶 子节点无法到达i点的最小花费 f[i] = sum { min(w(i,v), f[v]) | v是i的儿子节点 } 而这题有一个 上限权值,即权值大于上限的就不能去砍. 所以上面的转移要改一下 if (w

最短路专题【完结】

第一题 hdu 1317 XYZZY 点击打开hdu 1317 思路: 1 题目的图是一个有向图,并且可能存在环.第一个点的能量值为100,边的权值利用能量大小,例如2点为-60,如果1->2那么value[1][2] = -602 题目明确指出如果是要win的话,那么必须是经过的每条边都要大于0.那么我们只要把那些经过松弛操作后的点大于0的入队即可,小于等于0的点肯定不会出现在最终的路径上.3 如果存在正环的话,那么就有能量值无限大,那么这个时候只要判断这个点能否到达n4 判断是否是有环还是五

HDU 2962 Trucking:二分+带限制最短路

链接: http://acm.hdu.edu.cn/showproblem.php?pid=2962 题目: Trucking Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1211    Accepted Submission(s): 428 Problem Description A certain local truckin

EMR集群上capacity scheduler的ACL实现

背景 前面一篇介绍了yarn的capacity scheduler原理,实验了在EMR集群上使用capacity scheduler对集群资源的隔离和quota的限制.本文会介绍EMR集群上capacity scheduler的ACL实现. 为什么要做这个?前面给集群分配的资源分配了多个队列,以及每个队列的资源配比和作业调度的优先级.如果多租户里面的每个都按照约定,各自往自己对应的队列里面提交作业,自然没有问题.但是如果用户熟悉capacity scheduler的操作和原理,也是可以占用别组的

利用yarn capacity scheduler在EMR集群上实现大集群的多租户的集群资源隔离和quota限制

背景 使用过hadoop的人基本都会考虑集群里面资源的调度和优先级的问题,假设你现在所在的公司有一个大hadoop的集群,有很多不同的业务组同时使用.但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这两个任务呢?是先执行A的任务,再执行B的任务,还是同时跑两个? 目前一些使用EMR的大公司,会使用一个比较大的集群,来共公司内部不同业务组的人共同使用,相对于使用多个小集群,使用大的集群一方面可以达到更

Android异步加载图片详解之方式二(2)

FileCache.java如下: package com.cn.loadImages; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.content.Conte

十分钟学习WEBGLOGIC6.1

web WEBLOGIC 6.1 的安装 无状态SessionBean开发 数据源的设置 JMS的使用的简单介绍WEBLOGIC 6.1 的安装所需软件: 一个安装用压缩包和一个破解的文件安装过程:1.双击安装文件,将WEBLOGIC安装到D:\BEA在询问是否作为一个WINGDOW SERVER时,选择NO其余选缺省值2.按照破解说明,README文件,去除30天限制3.编辑 D:\bea\wlserver6.1\config\mydomain tartWebLogic.cmd69行中 set