[洛谷P3254] [网络流24题] 圆桌游戏

Description

假设有来自m 个不同单位的代表参加一次国际会议。每个单位的代表数分别为ri (i =1,2,……,m)。

会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,……,n)个代表就餐。

为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。试设计一个算法,给出满足要求的代表就餐方案。

对于给定的代表数和餐桌数以及餐桌容量,编程计算满足要求的代表就餐方案。

Input

第1 行有2 个正整数m 和n,m 表示单位数,n 表示餐桌数,1<=m<=150, 1<=n<=270。

第2 行有m 个正整数,分别表示每个单位的代表数。

第3 行有n 个正整数,分别表示每个餐桌的容量。

Output

如果问题有解,第1 行输出1,否则输出0。接下来的m 行给出每个单位代表的就餐桌号。如果有多个满足要求的方案,只要输出1 个方案。

Sample Input

4 5

4 5 3 5

3 5 2 6 4

Sample Output

1

1 2 4 5

1 2 3 4 5

2 4 5

1 2 3 4 5


想法

因为是网络流24题,所以上来我先想的是怎么用可爱的最小割。

没想出来,于是仔细分析了一下题意。

发现,诶,好像贪心就可以啊……

单位代表数排个序,每个餐桌剩余容量排个序,先做剩余容量多的餐桌。

就A了……

之后又想了想网络流怎么做。

S向每个单位连容量为单位代表数的边,每个单位向所有餐桌连容量为1的边,每个餐桌向T连容量为餐桌容量的边。

跑一边最大流,看S发出的边是否都满流就完了。

这可真是一道辣鸡题……


代码

(贪心)

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 275;
const int M = 155;

struct data{
    int v,id;
    bool operator < (const data &b) const{
        return v>b.v;
    }
}d[N],r[M];

int c[M][N],w[M];
int n,m;

int main()
{
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++){
        scanf("%d",&r[i].v);
        r[i].id=i;
        w[i]=r[i].v;
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&d[i].v);
        d[i].id=i;
    }

    int flag=1;
    sort(r+1,r+1+m);
    for(int i=1;i<=m;i++){
       sort(d+1,d+1+n);
       for(int j=1;j<=r[i].v;j++){
           if(!d[j].v) break;
           c[r[i].id][j]=d[j].id;
           d[j].v--;
       }
       if(!c[r[i].id][r[i].v]) { flag=0; break; }
    }

    if(flag==0) printf("0\n");
    else {
        printf("1");
        for(int i=1;i<=m;i++){
            printf("\n%d",c[i][1]);
            for(int j=2;j<=w[i];j++)
                printf(" %d",c[i][j]);
        }
    }

    return 0;
}

原文地址:https://www.cnblogs.com/lindalee/p/8456599.html

时间: 2024-10-17 04:17:04

[洛谷P3254] [网络流24题] 圆桌游戏的相关文章

[网络流24题] 圆桌聚餐

729. [网络流24题] 圆桌聚餐 ★★   输入文件:roundtable.in   输出文件:roundtable.out   评测插件 时间限制:1 s   内存限制:128 MB   «问题描述: 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri(i=1,2,3...m), .会议餐厅共有n张餐桌,每张餐桌可容纳c i(i=1,2...n) 个代表就餐. 为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐.试设计一个算法, 给出满足要求的代表就

[网络流24题]圆桌问题

Description 假设有来自$n$个不同单位的代表参加一次国际会议.每个单位的代表数分别为$r_i(i\;\in\;[1,n])$.会议餐厅共有$m$张餐桌,每张餐桌可容纳$c_i(i\;\in\;[1,m])$个代表就餐.为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐.求满足要求的代表就餐方案. Input 第$1$行有$2$个正整数$m,n.m$表示单位数,$n$表示餐桌数. 第$2$行有$m$个正整数,分别表示每个单位的代表数. 文件第$3$行有$n$个正整数,分别

LiberOJ 6004. 「网络流 24 题」圆桌聚餐 网络流版子题

#6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 假设有来自 n nn 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri r_ir?i??.会议餐厅共有 m mm 张餐桌,每张餐桌可容纳 ci c_ic?i?? 个代表就餐.为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐. 试设计一个算法,给出满足要求的

【网络流24题】圆桌聚餐

LOJ 6004 [网络流24题]圆桌聚餐 题面 假设有来自\(n\)个不同单位的代表参加一次国际会议.每个单位的代表数分别为\(r_i\).会议餐厅共有\(m\)张餐桌,每张餐桌可容纳\(c_i\)个代表就餐. 为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐. 试设计一个算法,给出满足要求的代表就餐方案. 题解 源点向每个单位连一条边,边权是该单位人数: 每个单位向各个餐桌连一条边,边权是1: 每个餐桌向汇点连一条边,边权是餐桌容纳人数. 如果最大流 < 总人数,则无解.若有

【网络流24题】圆桌聚餐(最大流)

[网络流24题]圆桌聚餐(最大流) 题面 Cogs 题解 这道题很简单 首先每个单位的人数限制 直接从源点向单位连边,容量为人数 同样的, 每个桌子向汇点连边,容量为可以坐的人数 因为每个桌子只能够做一个该单位的人 所以,每个单位向桌子连边,容量为1 然后跑一边最大流求方案就行了 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath&

「网络流24题」 5. 圆桌问题

「网络流24题」 5. 圆桌问题 <题目链接> 二分图多重匹配. 多对多. 匈牙利似乎真的不太好办了. 所以乖乖最大流吧. 套路建模,S->每个单位(边权=单位代表数):每个餐桌->T(边权=餐桌容量):每个单位->每个餐桌(边权=1). 跑最大流. 最大流等于总代表数则有解,否则无解. 每个单位的出边中,每条满流边的终点便是这一单位每个代表的餐桌号. #include <algorithm> #include <climits> #include &

【网络流24题】圆桌问题

题目地址:https://www.luogu.com.cn/problem/P3254 分析&做法 这是一道比较简单的[网络流24题] 很容易想到二分图 左边$M$个点代表$M$个单位,右边$N$个点代表每一个桌子,对于$M$个公司,每一个公司向所有桌子连边,因为一个公司在一个桌子上只能派一个人,所以边权为$1$ 源点$S$连向左边的$M$个点,边权为该单位的人数$ri$,意思是这个公司派出了$ri$个人 右边的$N$个点连向汇点$T$,边权为该桌子的容量$ci$,意思是这个桌子最多坐$ci$个

14. [网络流24题] 搭配飞行员

14. [网络流24题] 搭配飞行员 ★★☆   输入文件:flyer.in   输出文件:flyer.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭配驾驶员才能使出航的飞机最多. 如图,假设有10个驾驶员,如图中的V1,V2,…,V10就代表达10个驾驶员,其中V1,V2

【网络流24题】餐巾计划问题(最小费用最大流)

[网络流24题]餐巾计划问题(最小费用最大流) 题面 COGS 洛谷上的数据范围更大,而且要开longlong 题解 餐巾的来源分为两种: ①新买的 ②旧的拿去洗 所以,两种情况分别建图 先考虑第一种 因为新买餐巾没有任何限制,并且随时可以买 所以直接从源点向每一天连边,容量为INF,费用为餐巾的价格 因为流要流出去,所以每个点向汇点连边,容量为每天的用量,费用为0 第二种,旧的拿去洗 首先考虑一下怎么算有多少旧的餐巾 每天用旧的餐巾的数量值一定的,不可能变多 因此从源点向这些点连边,容量为每天