首页 > Web开发 > 详细

UVA - 820 Internet Bandwidth (因特网带宽)(最大流)

时间:2017-02-13 13:38:42      阅读:209      评论:0      收藏:0      [点我收藏+]

题意:给出所有计算机之间的路径和路径容量后,求出两个给定结点之间的流通总容量。(假设路径是双向的,且两方向流动的容量相同)

分析:裸最大流。标号从1开始,初始化的时候注意。

#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
const double eps = 1e-8;
inline int dcmp(double a, double b){
    if(fabs(a - b) < eps) return 0;
    return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 100 + 10;
const int MAXT = 10000 + 10;
using namespace std;
struct Edge{
    int from, to, cap, flow;
    Edge(int fr, int t, int c, int fl):from(fr), to(t), cap(c), flow(fl){}
};
struct Dinic{
    int n, m, s, t;
    vector<Edge> edges;
    vector<int> G[MAXN];
    bool vis[MAXN];
    int d[MAXN];
    int cur[MAXN];
    void init(int n){
        edges.clear();
        for(int i = 1; i <= n; ++i) G[i].clear();//标号从1开始
    }
    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){
        if(x == t || a == 0) return a;
        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))) > 0){
                e.flow += f;
                edges[G[x][i] ^ 1].flow -= f;
                flow += f;
                a -= f;
                if(a == 0) break;
            }
        }
        return flow;
    }
    int Maxflow(int s, int t){
        this -> s = s;
        this -> t = t;
        int flow = 0;
        while(BFS()){
            memset(cur, 0, sizeof cur);
            flow += DFS(s, INT_INF);
        }
        return flow;
    }
}di;
int main(){
    int n;
    int kase = 0;
    while(scanf("%d", &n) == 1){
        if(!n) return 0;
        di.init(n);
        int s, t, c;
        scanf("%d%d%d", &s, &t, &c);
        for(int i = 0; i < c; ++i){
            int x, y, v;
            scanf("%d%d%d", &x, &y, &v);
            di.AddEdge(x, y, v);//路径双向
            di.AddEdge(y, x, v);
        }
        printf("Network %d\nThe bandwidth is %d.\n\n", ++kase, di.Maxflow(s, t));
    }
    return 0;
}

  

UVA - 820 Internet Bandwidth (因特网带宽)(最大流)

原文:http://www.cnblogs.com/tyty-Somnuspoppy/p/6393309.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!