804人阅读 评论(0)

# 我是歌手

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 350    Accepted Submission(s): 124

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

Input

[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



Source

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<string>
#include<algorithm>
#include<time.h>
#include<bitset>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T> inline void gmax(T &a,T b){if(b>a)a=b;}
template <class T> inline void gmin(T &a,T b){if(b<a)a=b;}
const int N=240,M=14000,Z=1e9+7,maxint=2147483647,ms31=522133279,ms63=1061109567,ms127=2139062143;const double eps=1e-8,PI=acos(-1.0);//.0
int casenum,casei;
int id,ST,ED;
int n,m,g,L,x,y;
int first[N],w[M],cap[M],nxt[M];
bool e[80][80];
void ins(int x,int y,int cap_)
{
id++;
w[id]=y;
cap[id]=cap_;
nxt[id]=first[x];
first[x]=id;
id++;
w[id]=x;
cap[id]=0;
nxt[id]=first[y];
first[y]=id;
}
int d[N];
bool bfs()
{
MS(d,-1);d[ST]=0;
queue<int>q;q.push(ST);
while(!q.empty())
{
int x=q.front();q.pop();
for(int z=first[x];z;z=nxt[z])if(cap[z])
{
int y=w[z];
if(d[y]==-1)
{
d[y]=d[x]+1;
if(y==ED)return 1;
q.push(y);
}
}
}
return 0;
}
int dfs(int x,int all)
{
if(x==ED)return all;
int use=0;
for(int z=first[x];z;z=nxt[z])if(cap[z])
{
int y=w[z];
if(d[y]==d[x]+1)
{
int tmp=dfs(y,min(cap[z],all-use));
cap[z]-=tmp;
cap[z^1]+=tmp;
use+=tmp;
if(use==all)break;
}
}
if(use==0)d[x]=-1;
return use;
}
int dinic(int flow)
{
int tmp=0;
while(bfs())tmp+=dfs(ST,flow);
return tmp;
}
void build(int mid)
{
MS(first,0);id=1;
for(int i=1;i<=m;i++)ins(n+i,n+m+i,L);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(e[i][j])ins(i,n+m+j,1);
else ins(i,n+j,1);
}
}
ST=0;
ED=n+m+m+1;
for(int i=1;i<=n;i++)ins(ST,i,mid);
for(int i=1;i<=m;i++)ins(n+m+i,ED,mid);
}
int main()
{
scanf("%d",&casenum);
for(casei=1;casei<=casenum;casei++)
{
scanf("%d%d%d%d",&n,&m,&g,&L);
MS(e,0);
while(g--)
{
scanf("%d%d",&x,&y);
e[x][y]=1;
}
int l=0;
int r=m;
while(l<r)
{
int mid=(l+r+1)>>1;
build(mid);
if(dinic(mid*n)==mid*n)l=mid;
else r=mid-1;
}
printf("Case %d: %d\n",casei,l);
}
return 0;
}
/*
【trick&&吐槽】
1，最大能安排的演唱会次数是多少呢？
只看一个人，这个人最多每首歌唱一次，所以ans不会超过m。
2，网络流每次跑都要重新建图。
3，初始化是在每次建图之前都要进行的。

【题意】

【类型】

【分析】

【时间复杂度&&优化】

*/

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：269294次
• 积分：8270
• 等级：
• 排名：第2396名
• 原创：555篇
• 转载：0篇
• 译文：0篇
• 评论：135条
文章分类
最新评论