解题报告
http://blog.csdn.net/juncoder/article/details/38237641
题目传送门
题意:
N个电影,每个电影在每一周有固定拍映时间,电影必须在W周前演完。有一个演员,他每天只能演一场电影,对于每部电影必须演完D天才算完。
思路:
二分图多重最大匹配问题,对于每个电影,源点与每个电影连上一条边容量为D,电影与每周7天对应拍映连线,容量为1,每周每天与汇点连线容量为1
在二分图最大匹配中,每个点(不管是X方点还是Y方点)最多只能和一条匹配边相关联,然而,我们经常遇到这种问题,即二分图匹配中一个点可以和多条匹配边相关联,但有上限,或者说,Li表示点i最多可以和多少条匹配边相关联。
在原图上建立源点S和汇点T,S向每个X方点连一条容量为该X方点L值的边,每个Y方点向T连一条容量为该Y方点L值的边,原来二分图中各边在新的网络中仍存在,容量为1(若该边可以使用多次则容量大于1),求该网络的最大流,就是该二分图多重最大匹配的值。
#include
#include
#include
#include
#define inf 99999999
using namespace std;
int mmap[400][400],n,l[400],m;
int bfs()
{
memset(l,-1,sizeof(l));
queueQ;
Q.push(0);
l[0]=0;
while(!Q.empty()) {
int u=Q.front();
Q.pop();
for(int i=0; i<=m; i++) {
if(l[i]==-1&&mmap[u][i]) {
l[i]=l[u]+1;
Q.push(i);
}
}
}
if(l[m]>1)
return 1;
return 0;
}
int dfs(int x,int f)
{
int a;
if(x==m)return f;
for(int i=0; i<=m; i++) {
if(l[i]==l[x]+1&&mmap[x][i]&&(a=dfs(i,min(f,mmap[x][i])))) {
mmap[x][i]-=a;
mmap[i][x]+=a;
return a;
}
}
l[x]=-1;
return 0;
}
int main()
{
int t,_h[10],d,w;
cin>>t;
while(t--) {
memset(mmap,0,sizeof(mmap));
memset(_h,0,sizeof(_h));
cin>>n;
int mon=0;
int sum=0;
for(int i=1; i<=n; i++) {
scanf("%d%d%d%d%d%d%d%d%d",&_h[1],&_h[2],&_h[3],&_h[4],&_h[5],&_h[6],&_h[7],&d,&w);
mmap[0][i]=d;
sum+=d;
if(mon
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 5277 | Accepted: 2168 |
Description
Input
Output
Sample Input
2 2 0 1 0 1 0 1 0 9 3 0 1 1 1 0 0 0 6 4 2 0 1 0 1 0 1 0 9 4 0 1 1 1 0 0 0 6 2
Sample Output
Yes No
Hint
A proper schedule for the first test case: date Sun Mon Tue Wed Thu Fri Sat week1 film1 film2 film1 film1 week2 film1 film2 film1 film1 week3 film1 film2 film1 film1 week4 film2 film2 film2
Source