题意:

我是歌手

Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)

Total Submission(s): 287 Accepted Submission(s): 97

Problem Description
2013年一开始,一档音乐节目“我是歌手”就惊艳了大家一回。闲话少说,现在,你成为了这档节目的总导演,你的任务很简单,安排每一期节目的内容。

现在有N个歌手,M种歌曲流派(Rock,Pop之类),每个歌手都有自己擅长的流派领域,这些资料都已整理好。你的工作是,安排尽可能多场的演唱比赛。每一场比赛所有歌手都必须上场,为了提高收视率,每个人演唱的歌曲类型不能相同,即便一些歌手要被迫选择一些他们不擅长的。同时,为了展现全面性,在不同的演唱比赛上,每个歌手都会安排不同的歌曲流派。

但是问题是,对于任何一个歌曲流派的歌迷,如果超过K个不擅长的歌手演唱了这种歌曲,他们就会表示不满,比如,发一些宣泄不满的帖子微博,为了表示观点挑起事端等等。你当然不希望这些事情与你的节目有关,在这个前提下,你可以任意安排尽可能多的比赛场次。


Input
输入第一行为T,表示有T组测试数据。

每组数据以四个数字N,M,L, K开始。L表示有L组擅长关系,接下来的L行,每一行有两个数字Ai,Bi,表示歌手Ai擅长Bi类型的歌曲。

[Technical Specification]

1. 1 <= T <= 100

2. 1 <= N <= M <= 74, 0 <= K <= N

3. 0 <= L <= N*M

4. 1 <= Ai <= N, 1 <= Bi <= M, 相同关系不会重复出现


Output
对每组数据,先输出为第几组数据,然后输出最多比赛场次。


Sample Input

3
1 1 1 0
1 1
1 3 0 1
3 3 5 1
1 1
1 2
2 2
2 3
3 1


Sample Output

Case 1: 1
Case 2: 3
Case 3: 2

Hint


对第三组样例,可以如此安排:
第一场三位歌手分别演唱(2,3,1)类型的歌曲,第二场分别演唱(1,2,3)。
这样只有类型3被不擅长的歌手演唱过1次,挑剔的歌迷观众还可以接受。



思路:
      没话说,看完第一反应就是个二分最大流,关键是在建图,说下建图吧.自己弱渣,建图建了4种才ac...
      
      设立超级远点和终点 s,t.
      s连接每一个人,流量是当前二分的 mid.
      然后连接 数据中给的人和歌曲类型,流量为1.
      每种类型连接t流量是mid.
      然后把每个歌曲类型k在拆出来一个点k'
      枚举每个人,如果当前这个人没连接k ,那么连接k'流量1
      每个k'连接k,流量是输入的那个K
    
      然后跑最大流,如果 ans >= mid * N,那么mid = low + 1.............

#include<stdio.h>
#include<string.h>
#include<queue> #define N_node 1000
#define N_edge 1000000
#define INF 1000000000

using namespace
std; typedef struct
{
int
to ,cost ,next;
}
STAR; typedef struct
{
int
x ,t;
}
DEP; typedef struct
{
int
a ,b;
}
EDGE; STAR E[N_edge];
EDGE edge[N_edge];
DEP xin ,tou;
int
list[N_node] ,tot;
int
list2[N_node];
int
deep[N_node];
int
mark[N_node][N_node]; void add(int a ,int b ,int c)
{

E[++tot].to = b;
E[tot].cost = c;
E[tot].next = list[a];
list[a] = tot; E[++tot].to = a;
E[tot].cost = 0;
E[tot].next = list[b];
list[b] = tot;
} int
minn(int x, int y)
{
return
x < y ? x : y;
} bool
bfs_deep(int s ,int t ,int n)
{

queue<DEP>q;
xin.x = s;
xin.t = 0;
memset(deep ,255 ,sizeof(deep));
deep[s] = 0;
q.push(xin);
while(!
q.empty())
{

tou = q.front();
q.pop();
for(int
k = list[tou.x] ;k ;k = E[k].next)
{

xin.x = E[k].to;
xin.t = tou.t + 1;
if(
deep[xin.x] != -1 || !E[k].cost)
continue;

deep[xin.x] = xin.t;
q.push(xin);
}
}
for(int
i = 0; i <= n ;i ++)
list2[i] = list[i];
return
deep[t] != -1;
} int
dfs_flow(int s ,int t ,int flow)
{
if(
s == t) return flow;
int
nowflow = 0;
for(int
k = list2[s] ;k ;k = E[k].next)
{
int
to = E[k].to;
int
c = E[k].cost;
list2[s] = k;
if(
deep[to] != deep[s] + 1 || !E[k].cost)
continue;
int
tmp = dfs_flow(to ,t ,minn(c ,flow - nowflow));
nowflow += tmp;
E[k].cost -= tmp;
E[k^1].cost += tmp;
if(
nowflow == flow) break;
}
if(!
nowflow) deep[s] = 0;
return
nowflow;
} int
DINIC(int s ,int t ,int n)
{
int
ans = 0;
while(
bfs_deep(s ,t ,n))
{

ans += dfs_flow(s ,t ,INF);
}
return
ans;
} bool
ok(int mid ,int L ,int K ,int N ,int M)
{

memset(list ,0 ,sizeof(list));
tot = 1;
int
s = 0 ,t = N + M + M + 1 ,i;
for(
i = 1 ;i <= N ;i ++)
add(s ,i ,mid);
for(
i = 1 ;i <= M ;i ++)
{

add(i + N ,t ,mid);
add(i + N + M ,i + N ,K);
} for(
i = 1 ;i <= L ;i ++)
add(edge[i].a ,edge[i].b + N,1); for(i = 1 ;i <= N ;i ++)
for(int
j = 1 ;j <= M ;j ++)
if(!
mark[i][j])
add(i ,j + N + M ,1); return DINIC(s ,t ,t) >= mid * N;
} int main ()
{
int
N ,M ,L ,K;
int
i ,j ,a ,b;
int
low ,mid ,up;
int
t ,cas = 1;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d %d %d %d" ,&N ,&M ,&L ,&K);
memset(mark ,0 ,sizeof(mark));
for(
i = 1 ;i <= L ;i ++)
{

scanf("%d %d" ,&edge[i].a ,&edge[i].b);
mark[edge[i].a][edge[i].b] = 1;
}

low = 0 ,up = M;
int
ans = 0;
while(
low <= up)
{

mid = (low + up) >> 1;
if(
ok(mid ,L ,K ,N ,M))
{

ans = mid;
low = mid + 1;
}
else

up = mid - 1;
}

printf("Case %d: %d\n" ,cas ++ ,ans);
}
return
0;
}


hdu4560 不错的建图,二分最大流的更多相关文章

  1. 网络流--最大流--POJ 2139(超级源汇+拆点建图+二分+Floyd)

    Description FJ's cows really hate getting wet so much that the mere thought of getting caught in the ...

  2. zoj 3460 Missile【经典建图&&二分】

    Missile Time Limit: 2 Seconds      Memory Limit: 65536 KB You control N missile launching towers. Ev ...

  3. 【ARC069F】Flags 2-sat+线段树优化建图+二分

    Description ​ 数轴上有 n 个旗子,第 ii 个可以插在坐标 xi或者 yi,最大化两两旗子之间的最小距离. Input ​ 第一行一个整数 N. ​ 接下来 N 行每行两个整数 xi, ...

  4. POJ 1149 PIGS 建图,最大流

    题意: 你m个猪圈以及每个猪圈里原来有多少头猪,先后给你n个人,每个人能打开某一些猪圈并且他们最多想买Ki头猪,在每一个人买完后能将打开的猪圈中的猪顺意分配在这次打开猪圈里,在下一个人来之前 已打开的 ...

  5. HDU 4292 Food (建图思维 + 最大流)

    (点击此处查看原题) 题目分析 题意:某个餐馆出售f种食物,d种饮料,其中,第i种食物有fi份,第i种饮料有di份:此时有n个人来餐馆吃饭,这n个人必须有一份食物和一份饮料才会留下来吃饭,否则,他将离 ...

  6. Leapin' Lizards(经典建图,最大流)

    Leapin' Lizards http://acm.hdu.edu.cn/showproblem.php?pid=2732 Time Limit: 2000/1000 MS (Java/Others ...

  7. POJ - 1149 PIGS (建图思维+最大流)

    (点击查看原题) 题目分析 (以下均为 Edelweiss 大佬的思路,博主承认自己写不了这么好,但是学习的心促使我记录下这个好题的写法,所以代码是我写的) [题目大意] 有 M 个猪圈,每个猪圈里初 ...

  8. poj 2226 Muddy Fields(合理建图+二分匹配)

    /* 题意:用木板盖住泥泞的地方,不能盖住草.木板任意长!可以重叠覆盖! '*'表示泥泞的地方,'.'表示草! 思路: 首先让我们回忆一下HDU 2119 Matrix这一道题,一个矩阵中只有0, 1 ...

  9. 牛客练习赛53 D 德育分博弈政治课 (思维建图,最大流)

    牛客练习赛53 D德育分博弈政治课 链接:https://ac.nowcoder.com/acm/contest/1114/D来源:牛客网 题目描述 德育分学长最近玩起了骰子.他玩的骰子不同,他的骰子 ...

随机推荐

  1. JAVA学生宿舍管理系统

    转: JAVA学生宿舍管理系统 需要的工具 1.SQL Server 2.Eclipse 3.JDBC连接数据库驱动 https://download.microsoft.com/download/A ...

  2. POJ-3281(最大流+EK算法)

    Dining POJ-3281 这道题目其实也是网络流中求解最大流的一道模板题. 只要建模出来以后直接套用模板就行了.这里的建模还需要考虑题目的要求:一种食物只能给一只牛. 所以这里可以将牛拆成两个点 ...

  3. 十一. SpringCloud Alibaba

    1. SpringCloud Alibaba简介 1.1 为什么会出现SpringCloud Alibaba Spring Cloud Netflix项目进入到维护模式 什么是维护模式?=> 将 ...

  4. 一个把数据转化成Excel导出的程序 python Django

    把从数据库查询出来数据导出 源码下载!!!!! 效果图 登入界面 主页面 查询到数据 导出 打开得到文件 项目地址,源码下载

  5. 如何在 ASP.Net Core 中使用 Lamar

    ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器 来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解耦并有利于提高单元测试和 ...

  6. Kettle连接数据库失败

    Kettle是使用Java开发,开源的一款ETL工具,这里记录一下关于Kettle有关于数据库连接的问题 1.mysql版本需要注意区分,在mysql8.0的文档中官方已经给出,使用caching_s ...

  7. Vulkan移植GpuImage(一)高斯模糊与自适应阈值

    自适应阈值效果图 demo 这几天抽空看了下GpuImage的filter,移植了高斯模糊与自适应阈值的vulkan compute shader实现,一个是基本的图像处理,一个是组合基础图像处理聚合 ...

  8. C++11多线程编程(常见面试题)

    [题目1] 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码 [题解] 首先我们来分析一下这道题...( ...

  9. 【java框架】SpringBoot(4)--SpringBoot实现异步、邮件、定时任务

    1.SpringBoot整合任务机制 1.1.SpringBoot实现异步方法 日常开发中涉及很多界面与后端的交互响应,都不是同步的,基于SpringBoot为我们提供了注解方式实现异步方法.使得前端 ...

  10. 【hacker101 CTF】Photo Gallery

    0x01 打开首页看到 查看源代码,发现图片都是通过"fetch?id=1"这种方式加载的 简单测了一下存在SQL注入. 直接上sqlmap跑 第一个flag: ^FLAG^d45 ...