poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap

poj 2391 Ombrophobic Bovines,

最大流, 拆点, 二分


dinic

/*
 * Author: yew1eb
 * Created Time:  2014年10月31日 星期五 15时39分22秒
 * File Name: poj2391.cpp
 */
#include <ctime>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
const int inf = 1e9;
const ll  INF = 1e18;
const double eps = 1e-8;
const double pi = acos(-1.0);
const int maxn = 600;
const int maxm = 100000;
struct Edge{
	int to, next;
	int cap;
	Edge(){}
	Edge(int nt, int t, int cp):next(nt),to(t),cap(cp){}
}edge[maxm];

int head[maxn], tot;
int n, m, S, T;

void init(){
	tot = 0;
	memset(head, -1, sizeof head );
}

void add(int u, int v, int c){
	edge[tot] = Edge(head[u], v, c); head[u] = tot++;
	edge[tot] = Edge(head[v], u, 0); head[v] = tot++;
}

int d[maxn];
bool vis[maxn];

bool bfs(){
	queue<int> q;
	q.push(S);
	memset(vis, 0, sizeof vis );
	vis[S] = 1; d[S] = 0;
	while(!q.empty()){
		int u = q.front(); q.pop();
		for(int i=head[u]; ~i; i=edge[i].next){
			int &v = edge[i].to;
			if(!vis[v] && edge[i].cap>0){
				vis[v] = 1;
				d[v] = d[u] + 1;
				q.push(v);
			}
		}
	}
	return vis[T];
}

int dfs(int u, int a){
	if(u==T||a==0) return a;
	int flow = 0, f;
	for(int i=head[u];~i; i=edge[i].next){
		int &v = edge[i].to;
		if(d[u]+1==d[v]&&(f=dfs(v,min(a,edge[i].cap)))>0){
			edge[i].cap -= f;
			edge[i^1].cap += f;
			flow += f;
			a -= f;
			if(a==0) break;
		}
	}
	return flow;
}

int dinic(){
	int flow = 0;
	while(bfs()){
		flow += dfs(S, inf);
	}
	return flow;
}

ll g[maxn][maxn];
void floyd(){
	for(int k=1; k<=n; ++k)
		for(int i=1; i<=n; ++i)
			for(int j=1; j<=n; ++j){
				g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
			}
}

int a[maxn], b[maxn];
void create_graph(ll x){
	init();
	for(int i=1; i<=n; ++i)
		for(int j=1; j<=n; ++j)
			if(g[i][j]<=x)	add(i,j+n, inf);
	for(int i=1; i<=n; ++i){
		add(S, i, a[i]);
		add(i+n, T, b[i]);
	}
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
   // freopen("out.cpp", "w", stdout);
#endif // ONLINE_JUDGE
	scanf("%d%d", &n, &m);
	int u, v, c;
	S = 0, T = 2*n+2;
	int sum = 0;
	for(int i=1; i<=n; ++i){
		scanf("%d%d", &a[i], &b[i]);
		sum += a[i];
	}
	
	for(int i=1; i<=n; ++i) {
		g[i][i] = 0;
		for(int j=i+1; j<=n; ++j) 
			g[i][j] = g[j][i] = INF;
	}
	for(int i=1; i<=m; ++i){
		scanf("%d%d%d", &u, &v, &c);
		if(g[u][v]>c) g[u][v] = g[v][u] = c;
	}
	floyd();
		
	//bsearch
	ll l = 0, r = 0, mid, ans = -1;
	for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j)
		if(g[i][j]<INF) r = max(r, g[i][j]);
	while(l<=r){
		mid = (l+r)>>1;
		create_graph(mid);
		int flow = dinic();
		if(flow == sum){
			ans = mid;
			r = mid - 1;
		}else 
			l = mid + 1;
	}
	cout<<ans<<endl;
	return 0;
}



isap

int get_flow(int u, int flow)
{
    if(u==T || flow==0)return flow;
    int res=0, f;
    for(int i=head[u]; ~i; i=edge[i].next) {
        int &v = edge[i].to;
        if(d[u]>d[v] && (f=get_flow(v,min(flow,edge[i].cap)))>0) {
            edge[i].cap -= f;
            edge[i^1].cap += f;
            res += f;
            flow -= f;
            if(flow==0) return res;
        }
    }
    if(!(--gap[d[u]]))d[S]=cnt+2;
    gap[++d[u]]++;
    return res;
}

int isap()
{
    int flow = 0;
    memset(gap, 0, sizeof gap );
    memset(d, 0, sizeof d );
    cnt = T-S+1;//顶点数
    gap[0] = cnt;
    while(d[S]<cnt) flow += get_flow(S, inf);
    return flow;
}


内容概要:本文深入探讨了DevOps流程落地中自动化测试与监控体系的构建,强调二者是保障软件质量和系统稳定性的重要支柱。自动化测试涵盖从单元测试到端到端测试的全流程自动化,而监控体系则通过实时采集和分析系统数据,及时发现并解决问题。文章介绍了测试金字塔模型的应用、监控指标的分层设计、测试与生产环境的一致性构建以及告警策略的精细化设置等核心技巧。此外,还提供了基于Python和Prometheus的具体代码案例,包括自动化接口测试脚本和监控指标暴露的实现,展示了如何在实际项目中应用这些技术和方法。 适合人群:对DevOps有一定了解,从事软件开发、运维或测试工作的技术人员,特别是那些希望提升自动化测试和监控能力的从业者。 使用场景及目标:①高并发业务系统中,模拟大规模用户请求,验证系统抗压能力和稳定性;②关键业务流程保障,确保金融交易、医疗数据处理等敏感业务的合规性和可追溯性;③微服务架构系统下,通过契约测试和分布式链路追踪,保证服务间的兼容性和故障快速定位。 阅读建议:本文不仅提供了理论指导,还有详细的代码示例,建议读者结合自身项目的实际情况,逐步实践文中提到的技术和方法,特别是在构建自动化测试框架和监控系统时,关注环境一致性、测试覆盖率和性能指标等方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值