最大流(dinic,正向表)模版

喜欢dinic算法,清晰,简洁,高效,优雅。

uva820.

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <utility>
#include <algorithm>
using namespace std;

const int Maxn = 105;
const int Maxm = 30005;
const int inf = 0x1fffffff;

int n, m, s, t, queue[Maxn], lab[Maxn];
int tot, h[Maxn], nxt[Maxm<<1], v[Maxm<<1], res[Maxm<<1];

void addEdge(int a, int b, int c) {
    v[tot] = b; res[tot] = c; nxt[tot] = h[a]; h[a] = tot++;
    v[tot] = a; res[tot] = 0; nxt[tot] = h[b]; h[b] = tot++;
}

bool bfs(int s, int t) {
    int head, tail, u;
    memset(lab, -1, sizeof(lab));
    lab[s] = head = tail =0;
    queue[0] = s;
    while(head <= tail) {
        u = queue[head++];
        for(int i = h[u]; i != -1; i = nxt[i])
            if(res[i]>0 && lab[v[i]]==-1) {
                lab[v[i]] = lab[u] +1;
                queue[++tail] = v[i];
            }
    }
    if(lab[t] != -1)  return  true;
    else  return  false;
}

int dinicDfs(int delta, int u) {
    int sum =0, tmp;
    if(u == t)  return  delta;
    else {
        for(int i = h[u]; i != -1; i = nxt[i])
            if(lab[v[i]]==lab[u]+1 && res[i]>0) {
                tmp = dinicDfs(min(delta, res[i]), v[i]);
                sum += tmp;
                delta -= tmp;
                res[i] -= tmp;
                res[i^1] += tmp;
            }
        return  sum;
    }
}

int maxFlow(int s, int t) {
    int ans =0;
    while(bfs(s, t))
        ans += dinicDfs(inf, s);
    return  ans;
}

int main()
{
    int a, b, c, Case = 0;
    freopen("data.in", "r", stdin);
    while(scanf("%d", &n) != EOF) {
        if(n == 0)  break;
        tot = 0;
        memset(h, -1, sizeof(h));
        scanf("%d%d%d", &s, &t, &m);
        for(int i = 0; i < m; i++) {
            scanf("%d%d%d", &a, &b, &c);
            addEdge(a, b, c);
            addEdge(b, a, c);
        }
        int ans = maxFlow(s, t);
        printf("Network %d\n", ++Case);
        printf("The bandwidth is %d.\n\n", ans);
    }
    return  0;
}

转载于:https://www.cnblogs.com/fCarver7/archive/2012/09/23/2699117.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件测试需求是开发测试用例的依据,测试需求分解的越详细精准,明对所测软件的了解越深,对所要进行的任务内容就越清晰,对测试用例的设计质量的帮助越大。详细的测试需求还是衡量测试覆盖率的重要指标,测试需求是计算测试覆盖的分母,没有详细的测试需求就无法有效的进行测试覆盖计算。 软件测试执行阶段是由一系列不同的测试类型的执行过程组成的,每种测试类型都有其具体的测试目标和支持技术,每种测试类型都只侧重于对测试目标的一个或多个特征或属性进行测试,准确的测试类型可以给软件测试带事半功倍的效果。 现有的软件测试分析技术不太成熟,对测试需求和测试类型的分析,所采用的方法主要是根据经验进行收集、整理,该方法依赖于测试设计人员的测试经验,由此方法得出的测试需求、测试类型往往导致测试用例设计不充分,测试覆盖度低,测试目的性不强,容易遗漏等缺陷。 可见,如何对测试需求进行细致的整理分析,明确测试执行时的测试类型,是一个亟待解决的问题。 有鉴于此,本方法的主要目的在于提供一种软件测试需求的分析方法,可以方便、详尽的获取测试需求,明确测试执行时需要实施的测试类型。 为实现上述目的,本方法提供了一种软件测试需求分析的方法,包括以下步骤: a)列出软件开发需求中具有可测试性的开发需求; b)对步骤a)列出的每一条开发需求,形成可测试的分层描述的测试需求; c)对步骤b)形成的每一条测试需求,从GB/T 16260.1-2006《软件工程 产品质量 第1部分:质量模型》中定义的软件内部/外部质量模型来确定软件产品的质量需求; d)对步骤c)所确定的质量需求,分析测试执行时需要实施的测试类型; e)建立测试需求跟踪矩阵,对测试需求进行管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值