zoukankan      html  css  js  c++  java
  • hdu 1839 Delay Constrained Maximum Capacity Path

    最短路+二分。

    对容量进行二分,因为容量和时间是单调关系的,容量越多,能用的边越少,时间会不变或者增加。

    因为直接暴力一个一个容量去算会TLE,所以采用二分。

    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<queue>
    #include<map>
    #include<algorithm>
    using namespace std;
    
    const int maxn = 10001;
    const int INF = 0x7FFFFFFF;
    struct aaa { int u, v, cc, tt; }node[500005];
    vector<aaa>ljb[maxn];
    int c[500005], dist[maxn], flag[maxn];
    int n, m, t;
    
    void spfa(int xianzhi)
    {
        int iii;
        queue<int>Q;
        memset(flag, 0, sizeof(flag));
        for (iii = 0; iii<=n; iii++) dist[iii] = INF;
        dist[1] = 0; Q.push(1); flag[1] = 1;
        while (!Q.empty())
        {
            int h = Q.front(); Q.pop(); flag[h] = 0;
            for (iii = 0; iii<ljb[h].size(); iii++)
            {
                aaa u = ljb[h][iii];
                if (u.cc >= xianzhi)
                {
                    if (u.u == h)
                    {
                        if (dist[u.u] + u.tt <= dist[u.v])
                        {
                            dist[u.v] = dist[u.u] + u.tt;
                            if (flag[u.v] == 0)
                            {
                                Q.push(u.v);
                                flag[u.v] = 1;
                            }
                        }
                    }
                    else if (u.v == h)
                    {
                        if (dist[u.v] + u.tt <= dist[u.u])
                        {
                            dist[u.u] = dist[u.v] + u.tt;
                            if (flag[u.u] == 0)
                            {
                                Q.push(u.u);
                                flag[u.u] = 1;
                            }
                        }
                    }
                }
            }
        }
    }
    
    int main()
    {
        int X;
        scanf("%d", &X);
        while (X--)
        {
            int i, j, u, v, tt;
            scanf("%d%d%d", &n, &m, &t);
            for (i = 0; i <= n; i++) ljb[i].clear();
            for (i = 0; i <= m; i++) node[i].tt = INF;
            for (i = 0; i < m; i++)
            {
                scanf("%d%d%d%d", &u, &v, &c[i], &tt);
                node[i].u = u; node[i].v = v;
                node[i].cc = c[i]; node[i].tt = tt;
                ljb[v].push_back(node[i]); ljb[u].push_back(node[i]);
            }
            sort(c, c + m);
            int anss = -1, xx, dd, zz;
            xx = 0; dd = m - 1; zz = (xx + dd) / 2;
            while (1)
            {            
                spfa(c[zz]);
                if (dist[n] <= t) { anss = zz; xx = zz + 1; zz = (xx + dd) / 2; }
                else { dd = zz; zz = (xx + dd) / 2; }
                if (xx >= dd) break; 
            }
            printf("%d
    ", c[anss]);
        }
        return 0;
    }
  • 相关阅读:
    8.JavaCC官方入门指南-例3
    7.JavaCC官方入门指南-例2
    6.JavaCC官方入门指南-例1
    5.JavaCC官方入门指南-概述
    4.JavaCC处理中文字符
    3.JavaCC 语法描述文件的格式解析
    2.idea安装JavaCC插件.md
    SQL 高效运行注意事项(二)
    视图用到的表更新表结构时注意刷新视图
    SQL 高效运行注意事项(一)
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4524398.html
Copyright © 2011-2022 走看看