网络流24题之分配问题

题目链接:传送门

这道题和运输问题也是贼相似的,几乎一模一样
详细见网络流24题之分配问题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
        f=(c=='-')?-1:1,c=getchar();
    while(c>='0'&&c<='9')
        x=x*10+c-'0',c=getchar();
    return x*f;
}
struct node{
    int to,next,v,w;
}a[100001];
int dis[1001],f[1001],pre[1001],fa[1001],head[1001],cnt,n,m,s,t,z,w,ans,ans1;
void add(int x,int y,int c,int v){
    a[++cnt].to=y;
    a[cnt].next=head[x];
    a[cnt].v=c;
    a[cnt].w=v;
    head[x]=cnt;
}
queue<int> q ;
int spfa() {
    memset(dis,127,sizeof(dis));
    memset(f,0,sizeof(f));
    q.push(s);
    f[s]=1;
    int inf=dis[1];
    dis[s]=0;
    while(!q.empty()) {
        int now=q.front();
        q.pop();
        f[now]=0;
        for(int i=head[now]; i; i=a[i].next) {
            int v=a[i].to;
            if(dis[v]>dis[now]+a[i].w&&a[i].v) {
                dis[v]=dis[now]+a[i].w;
                fa[v]=now;
                pre[v]=i;
                if(!f[v])
                    q.push(v),f[v]=1;
            }
        }
    }
    if(dis[t]!=inf)
        return 1;
    return 0;
}
void answer() {
    ans=0,ans1=0;
    while(spfa()) {
        int minx=2147483647;
        for(int i=t; i!=s; i=fa[i])
            minx=min(minx,a[pre[i]].v);
        ans+=minx,ans1+=dis[t]*minx;
        for(int i=t; i!=s; i=fa[i]) {
            a[pre[i]].v-=minx;
            if(pre[i]%2)
                a[pre[i]+1].v+=minx;
            else
                a[pre[i]-1].v+=minx;
        }
    }
}
int x[1001][1001];
int main(){
    n=read();
    t=n*2+1;
    for(int i=1;i<=n;i++)
        add(s,i,1,0),add(i,s,0,0);
    for(int i=1;i<=n;i++)
        add(i+n,t,1,0),add(t,i+n,0,0);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            x[i][j]=read(),add(i,j+n,10000000,x[i][j]),add(j+n,i,0,-x[i][j]);
    answer();
    printf("%d\n",ans1);
    memset(head,0,sizeof(head)),cnt=0;
    for(int i=1;i<=n;i++)
        add(s,i,1,0),add(i,s,0,0);
    for(int i=1;i<=n;i++)
        add(i+n,t,1,0),add(t,i+n,0,0);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            add(i,j+n,1,-x[i][j]),add(j+n,i,0,x[i][j]);
    answer();
    printf("%d",-ans1);
}

原文地址:https://www.cnblogs.com/hbxblog/p/9716455.html

时间: 2024-08-25 18:31:14

网络流24题之分配问题的相关文章

【网络流24题】分配问题(二分图最佳匹配)(费用流)

[网络流24题]分配问题 2014年3月11日1,8720 题目描述 Description 有n件工作要分配给n个人做.第i 个人做第j 件工作产生的效益为ij c .试设计一个将n件工作分配给n个人做的分配方案,使产生的总效益最大.«编程任务:对于给定的n件工作和n个人,计算最优分配方案和最差分配方案. 输入描述 Input Description 第1 行有1 个正整数n,表示有n件工作要分配给n 个人做.接下来的n 行中,每行有n 个整数 cij ,1≤i≤n,1≤j≤n,表示第i 个人

【网络流24题】分配问题

Description 有n件工作要分配给n个人做.第i 个人做第j 件工作产生的效益为ij c .试设计一个将n件工作分配给n个人做的分配方案,使产生的总效益最大. 对于给定的n件工作和n个人,计算最优分配方案和最差分配方案. Input 第1 行有1 个正整数n,表示有n件工作要分配给n 个人做. 接下来的n 行中,每行有n 个整数ij c ,1≤i≤n,1≤j≤n,表示第i 个人做第j件工作产生的效益为ij c . Output 将计算出的最小总效益和最大总效益输出 Sample Inpu

[网络流24题] 分配问题

740. [网络流24题] 分配问题 ★★   输入文件:job.in   输出文件:job.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述: 有n件工作要分配给n个人做.第i 个人做第j 件工作产生的效益为ij c .试设计一个将n件工作分配给n个人做的分配方案,使产生的总效益最大. «编程任务: 对于给定的n件工作和n个人,计算最优分配方案和最差分配方案. «数据输入: 由文件job.in提供输入数据.文件的第1 行有1 个正整数n,表示有n件工作要分配给n 个

「网络流24题」 18. 分配问题

「网络流24题」 18. 分配问题 <题目链接> 费用流其实是可以做这题的. 但这篇主要说一下二分图最佳完美匹配--Kuhn-Munkres(KM)算法. 工作是X部,费用是Y部,边权为工作效益. 通过X部减去/Y部增加增广路上的松弛量,修改「顶标」(又称标杆). 初始顶标:X部点:最大权出边的边权:Y部点:0. 跑出来后,所有顶标和是最大效益. 所有边取负,跑出来的和的相反数是最小效益. 具体请看此篇题解. KM写法 #include <algorithm> #include &

网络流24题 -No.18 分配问题

问题描述 有 n件工作要分配给 n个人做.第 i 个人做第 j 件工作产生的效益为c[i,j] .试设计一个将n 件工作分配给 n个人做的分配方案,使产生的总效益最大. 编程任务对于给定的 n件工作和 n 个人,计算最优分配方案和最差分配方案. 数据输入输入的第 1 行有 1 个正整数 n,表示有 n件工作要分配给 n 个人做.接下来的 n 行中,每行有 n 个整数c[i,j],1≤i≤n,1≤j≤n,表示第 i 个人做第 j 件工作产生的效益为c[i,j] . 结果输出程序运行结束时,输出最小

「网络流24题」 题目列表

「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分图最小路径覆盖 <3> 4 魔术球问题 <4> 5 圆桌问题 <5> 6 最长递增子序列问题 <6> 7 试题库问题 <7> 8 机器人路径规划问题 <8> 9 方格取数问题 二分图最大点权独立集 <9> 10 餐巾计划问题

网络流24题 部分总结

网络流24题 部分总结 慢慢写吧... 以前做过一些了: 然后发现也做了不少了,集中写一下. 警告: 题目按照随机顺序排列. 文章中只有建模的方法. 最小路径覆盖问题 http://cogs.pro:8080/cogs/problem/problem.php?pid=728 题目即题解... // It is made by XZZ #include<cstdio> #include<algorithm> #include<cstring> #define File #

网络流24题小结

网络流24题 前言 网络流的实战应用篇太难做了,因此先完善这一部分 ## 第一题:飞行员配对方案 \(BSOJ2542\)--二分图 最优匹配 题意 两国飞行员\(x\)集合\(y\)集合,\(x\)飞行员可以配对特定的\(y\)集合的飞行员(可无),求一对一配对最大数 Solution 二分图最大匹配裸题,最大流实现 建图:(设\(i\in x\)而\(i'\in y\)) \((S,i,1)~(i',T,1)\) 对\((i,j')\)可匹配\((i,j',1)\) Code 略 ## 第二

【网络流24题----14】孤岛营救问题

孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形,其南北方向被划分为 N行,东西方向被划分为 M列,于是整个迷宫被划分为 N×M个单元.每个单元的位置可用一个有序数对 (单元的行号,单元的列号)来表示.南北或东西方向相邻的 2个单元之间可能互