poj2112(网络流-最大流+二分)

题意:给你k个挤奶器,c头牛,每个挤奶器能放m头牛,问你奶牛需要走的最大距离最小是多少;

解题思路:因为最大距离最小,也就是求最小的距离满足所有牛都能到,所以我们先用floyd跑最短路,把所有点之间的距离算出来后再,对答案进行二分:牛和挤奶器的距离<=二分值的可以连一条边,容量为1;

然后源点和奶牛连一条容量为1的边,挤奶器和汇点连一条容量为m的边,所以二分只是为了看奶牛是否能到达某个挤奶器;

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cstdio>
#define maxn 100500
#define inf 0x3f3f3f3f
using namespace std;
struct Edge
{
    int next;
    int to;
    int w;
    int fa;
}edge[maxn];
int head[maxn];
int x,y;
int dist[505][505];
int cnt;
int n,m,Start,End;
int k,c;
int depth[maxn];
void floyd()
{
    for(int l=1;l<=c+k;l++)
    {
        for(int i=1;i<=c+k;i++)
        {
            for(int j=1;j<=c+k;j++)
            {
                if(dist[i][j]>dist[i][l]+dist[l][j])
                    dist[i][j]=dist[i][l]+dist[l][j];
            }
        }
    }
}
void add(int u,int v,int w)
{
    edge[cnt].next=head[u];edge[cnt].to=v;
    edge[cnt].fa=u;edge[cnt].w=w;head[u]=cnt++;
    edge[cnt].next=head[v];edge[cnt].w=0;
    edge[cnt].to=u;edge[cnt].fa=v;head[v]=cnt++;
}
bool bfs()
{
    memset(depth,0,sizeof(depth));
    queue<int>q;
    q.push(Start);
    depth[Start]=1;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            int v=edge[i].to;
            if(depth[v]||edge[i].w<=0)
                continue;
            depth[v]=depth[u]+1;
            q.push(v);
        }
    }
    return depth[End];
}
int dfs(int u,int maxflow)
{
    if(u==End)
        return maxflow;
    int add=0;
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].to;
        if(depth[v]!=depth[u]+1)
            continue;
        if(edge[i].w==0)
            continue;
        int tempflow=dfs(v,min(edge[i].w,maxflow-add));
        edge[i].w-=tempflow;
        edge[i^1].w+=tempflow;
        add+=tempflow;
    }
    return add;
}
int dinic()
{
    int ans=0;
    while(bfs())
    {
        ans+=dfs(Start,inf);
    }
    return ans;
}
void buildmap(int value)
{
    memset(head ,-1,sizeof(head));
    cnt=0;
    for(int i=k+1;i<=k+c;i++)
    {
        add(0,i,1);
    }
    for(int i=k+1;i<=k+c;i++)
    {
        for(int j=1;j<=k;j++)
        {
            if(dist[i][j]<=value)
            {
                add(i,j,1);
               // cout<<i<<" "<<j<<endl;
            }
        }
    }
    for(int i=1;i<=k;i++)
    {
        add(i,k+c+1,m);
    }
}
int main()
{
    scanf("%d%d%d",&k,&c,&m);
    Start=0;End=k+c+1;
    for(int i=1;i<=k+c;i++)
    {
        for(int j=1;j<=k+c;j++)
        {
            scanf("%d",&dist[i][j]);
            if(dist[i][j]==0)
                dist[i][j]=inf;
        }
    }
    floyd();
    int l=0,r=10000;
    while(l<r)
    {
        int mid=(l+r)/2;
        buildmap(mid);
        int xx=dinic();
        if(xx>=c)
        {
            r=mid;
        }
        else
        {
                l=mid+1;
        }
    }
    printf("%d\n",r);
}

  

转载于:https://www.cnblogs.com/huangdao/p/9304470.html

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值