zoukankan      html  css  js  c++  java
  • poj 2455 Secret Milking Machine

    题意:有N个点,之间有P条路(双向),要求每次从1到N走不同的路T次,求这T次中两点间路最长的一条

    思路:二分+最大流,如果两点之间有路,就建立流量为1的网络,然后二分路径长度,从新建立符合要求的图,求最大流

    注意重边的情况,如果是邻接表没事,否则注意,边不是取最小,要都存下,因为有可能都符合要求,WA了很多次都是错在这了

    三个小时就这么没了……今天一早,看出了原因了,于是用vector解决了,明显很慢啊,不知道是不是模板的原因……

    核心code:

    vector<int>  map[nMax][nMax];  //原始图

    void rebuild(int mid)
    {
    memset(G, 0, sizeof(G));
    memset(F, 0, sizeof(F));  //
    for(int i=1; i<=n; i++)
    for(int j=1; j<=n; j++)
    {
    int tt=map[i][j].size();
    for(int t=0; t<tt; t++)
    if(map[i][j][t]<=mid)
    G[i][j]+=1;  //重建的网络
    }
    }

    int main()
    {
    scanf("%d%d%d", &n, &m, &t);
    source=1;  //源点
    sink=n;    //汇点
    int x, y, dist;
    for(int i=1; i<=m; i++)
    {
    scanf("%d%d%d", &x, &y, &dist);
    map[x][y].push_back(dist);
    map[y][x].push_back(dist);
    Max=max(Max, dist);
    Min=min(Min, dist);
    }
    int mid,flow;
    while(Max > Min)
    {
    mid=(Max+Min)/2;
    rebuild(mid);
    //cout<<ans<<" ";
    flow=find_max_flow();
    if(flow>=t)
    Max=mid;
    else
    Min=mid+1;
    }
    printf("%d\n", Max);
    return 0;
    }
  • 相关阅读:
    hdu 1023 卡特兰数+高精度
    hdu 1568 Fibonacci 快速幂
    hdu 3054 Fibonacci 找循环节的公式题
    hdu 5167 Fibonacci 打表
    hdu 4165 Pills dp
    HDU 5791 Two DP
    BZOJ 2152: 聪聪可可 树分治
    HDU 5213 Lucky 莫队+容斥
    HDU 5145 NPY and girls 莫队+逆元
    BZOJ 3289: Mato的文件管理 莫队+BIT
  • 原文地址:https://www.cnblogs.com/FreeAquar/p/2144149.html
Copyright © 2011-2022 走看看