HDU 4240 Route Redundancy 一条流最大的路径

来源:互联网 发布:淘宝正义哥假货 编辑:程序博客网 时间:2024/04/30 03:44

题目来源:HDU 4240 Route Redundancy

题意:求最大流与一条流最大的路径的比值 前者最大流求出 后者是每一条路的最小值再取大

思路:我用的是dinic 可以在DFS的时候在传递一个参数 表示当前增广路可以通过最大的流量 然后当x==t 到达汇点时 在取他们的最大值

#include <cstdio>#include <queue>#include <vector>#include <cstring>#include <algorithm>using namespace std;const int maxn = 610;const int INF = 999999999;int ans;struct Edge{    int from, to, cap, flow;    Edge(){}    Edge(int from, int to, int cap, int flow) : from(from), to(to), cap(cap), flow(flow){}};struct Point{    double d, x, y, r;    Point(){}    Point(double d, double x, double y, double r) : d(d), x(x), y(y), r(r){}}a[maxn];int n, m, s, t;vector <Edge> edges;vector <int> G[maxn];bool vis[maxn];int d[maxn];int cur[maxn];void AddEdge(int from, int to, int cap){    edges.push_back(Edge(from, to, cap, 0));    edges.push_back(Edge(to, from, 0, 0));    m = edges.size();    G[from].push_back(m-2);    G[to].push_back(m-1); }bool BFS(){    memset(vis, 0, sizeof(vis));    queue <int> Q;    Q.push(s);    d[s] = 0;    vis[s] = 1;    while(!Q.empty())    {        int x = Q.front(); Q.pop();        for(int i = 0; i < G[x].size(); i++)        {            Edge& e = edges[G[x][i]];            if(!vis[e.to] && e.cap > e.flow)            {                vis[e.to] = 1;                d[e.to] = d[x] + 1;                Q.push(e.to);            }        }    }    return vis[t];}int DFS(int x, int a, int v){if(x == t){ans = max(ans, v);return a;}    if(a == 0)    {return 0;    }    int flow = 0, f;    for(int& i = cur[x]; i < G[x].size(); i++)    {        Edge& e = edges[G[x][i]];        if(d[x] + 1 == d[e.to] && (f = DFS(e.to, min(a, e.cap-e.flow), min(v, e.cap))) > 0)        {            e.flow += f;            edges[G[x][i]^1].flow -= f;            flow += f;            a -= f;            if(a == 0)                break;        }    }    return flow;}int Maxflow(){    int flow = 0;    while(BFS())    {        memset(cur, 0, sizeof(cur));        flow += DFS(s, INF, INF);    }    return flow;}int main(){    int T;    scanf("%d", &T);    while(T--)    {        int cas, k;        scanf("%d %d %d %d %d", &cas, &n, &k, &s, &t);        edges.clear();        ans = 0;        for(int i = 0; i < n; i++)            G[i].clear();        for(int i = 0; i < k; i++)        {            int u, v, w;            scanf("%d %d %d", &u, &v, &w);            AddEdge(u, v, w);        }        int flow = Maxflow();        printf("%d %.3f\n", cas, (double)flow/ans);    }    return 0;}


 

0 0
原创粉丝点击