ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【网络流24题】餐巾计划问题

2019-07-16 16:01:11  阅读:143  来源: 互联网

标签:24 10 ch int 餐巾 网络 RG gc define


建边有技巧啊,要拆点。
网络流建边的核心规律就是多做题一定是从源点到汇点,根据此构建模型即可。
\(dinic\) 实现最小费用流

/*
@Date    : 2019-07-16 11:10:42
@Author  : Adscn (adscn@qq.com)
@Link    : https://www.cnblogs.com/LLCSBlog
*/
#include<bits/stdc++.h>
using namespace std;
#define IL inline
#define RG register
#define gi getint()
#define gc getchar()
#define File(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
IL int getint()
{
    RG int xi=0;
    RG char ch=gc;
    bool f=0;
    while(ch<'0'|ch>'9')ch=='-'?f=1:f,ch=gc;
    while(ch>='0'&ch<='9')xi=(xi<<1)+(xi<<3)+ch-48,ch=gc;
    return f?-xi:xi;
}
template<typename T>
IL void pi(T k,char ch=0)
{
    if(k<0)k=-k,putchar('-');
    if(k>=10)pi(k/10,0);
    putchar(k%10+'0');
    if(ch)putchar(ch);
}
const int inf=2147483647,N=2007;
int S=0,T;
struct edge{int v,nxt,flow,w;}e[N<<2];
int head[N<<1],cnt;
int cur[N<<1];
inline void add(int u,int v,int flow,int cost){e[cnt]=(edge){v,head[u],flow,cost};head[u]=cnt++;}
inline void link(int u,int v,int flow,int cost){add(u,v,flow,cost);add(v,u,0,-cost);}
int dis[N<<1];
bool vis[N<<1];
int spfa()
{
    memset(dis,127,sizeof dis);
    memset(vis,0,sizeof vis);
    static int Q[N<<1],l,r;
    dis[Q[l=r=0]=S]=0;
    while(l<=r)
    {
        int p=Q[l++];
        vis[p]=0;
        for(int i=head[p];~i;i=e[i].nxt)
        {
            int v=e[i].v;
            if(dis[v]>dis[p]+e[i].w&&e[i].flow)
            {
                dis[v]=dis[p]+e[i].w;
                if(!vis[v])Q[++r]=v,vis[v]=1;
            }
        }
    }
    return dis[T]<1e9;
}
long long ans;
int dfs(int p,int restflow)
{
    if(p==T||restflow==0)return restflow;
    int sumflow=0;
    vis[p]=1;
    for(int &i=cur[p],flow;(~i)&&restflow;i=e[i].nxt)
    {
        int v=e[i].v;
        if(vis[v]==0&&e[i].flow&&dis[v]==dis[p]+e[i].w&&(flow=dfs(v,min(restflow,e[i].flow))))
        {
            sumflow+=flow,restflow-=flow;
            e[i].flow-=flow,e[i^1].flow+=flow;
            ans+=1ll*flow*e[i].w;
        }
    }
    vis[p]=0;
    return sumflow;
}
void dinic(){while(spfa())memcpy(cur,head,sizeof head),dfs(S,inf);}
int main(void)
{
    #ifndef ONLINE_JUDGE
    File("file");
    #endif
    int n=gi;T=n*2+1;
    memset(head,-1,sizeof head);
    for(int i=1;i<=n;++i)
    {
        int x=gi;
        link(S,i,x,0);
        link(i+n,T,x,0);
    }
    int newcost=gi,fastday=gi,fastcost=gi,slowday=gi,slowcost=gi;
    for(int i=1;i<=n;++i)
    {
        if(i<n)link(i,i+1,inf,0);
        if(i+slowday<=n)link(i,i+n+slowday,inf,slowcost);
        if(i+fastday<=n)link(i,i+n+fastday,inf,fastcost);
        link(S,i+n,inf,newcost);
    }
    dinic();
    pi(ans);
    return 0;
}

标签:24,10,ch,int,餐巾,网络,RG,gc,define
来源: https://www.cnblogs.com/LLCSBlog/p/11195381.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有