| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
dinic + 二分差值 + 枚举上下界#include<stdio.h>
#include<queue>
#include<string.h>
#define INF 100000000
#define N 2005
using namespace std;
int tot;
struct map
{
int date;
int next;
int value;
}cun[2000000];
struct cow
{
int like[30];
}cc[1005];
struct dian
{
int x;
int t;
} old,xin;
int deep[N],n,b;
int list[N],value[N];
int listt[N];
void add(int a,int b,int c)
{
cun[++tot].date=b;
cun[tot].value=c;
cun[tot].next=list[a];
list[a]=tot;
cun[++tot].date=a;
cun[tot].value=0;
cun[tot].next=list[b];
list[b]=tot;
}
int BFS(int s,int t,int n)
{
xin.x=s;
xin.t=0;
//printf("!\n");
queue<dian>Q;
Q.push(xin);
memset(deep,255 ,sizeof(deep));
deep[s]=0;
while(!Q.empty())
{
old=Q.front();
Q.pop();
for(int k=list[old.x];k;k=cun[k].next)
{
int c=cun[k].value;
xin.x=cun[k].date;
// printf("%d\n",xin.x);
xin.t=old.t+1;
// printf("%d\n",deep[xin.x]);
if(deep[xin.x]!=-1||c==0) { continue;}
deep[xin.x]=xin.t;
Q.push(xin);
}
}
for(int i=0;i<=n;i++)
listt[i]=list[i];
return deep[t]!=-1 ;
}
int mmin(int a,int b)
{
if(a<b) return a;
else return b;
}
int DFS(int s,int t,int min)
{
if(s==t) return min;
int neww=0;
for(int k=listt[s];k;k=cun[k].next)
{
listt[s]=k;
int c=cun[k].value;
int date=cun[k].date;
if(c==0||deep[date]!=deep[s]+1) continue;
int m=DFS(date,t,mmin(c,min-neww));
neww+=m;
cun[k].value-=m;
cun[k^1].value+=m;
if(neww==min) break;
}
if(neww==0) deep[s]=0;
return neww;
}
int dinic(int s,int t,int n)
{
int num=0;
// printf("%d\n",BFS(s,t,n));
while(BFS(s,t,n))
{
// printf("!\n");
num+=DFS(s,t,INF);
}
return num;
}
int init(int x,int y)
{
memset(list,0,sizeof(list));
tot=1;
int s=n+b+10,t=s+1;
for(int i=1;i<=n;i++)
add(s,i,1);
for(int i=n+1;i<=n+b;i++)
add(i,t,value[i-n]);
for(int i=1;i<=n;i++)
for(int j=x;j<=y;j++)
add(i,cc[i].like[j]+n,1);
int k=dinic(s,t,t+10);
// printf("k=%d\n",k);
return k==n;
}
int main()
{
while(scanf("%d%d",&n,&b)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=b;j++)
scanf("%d",&cc[i].like[j]);
for(int i=1;i<=b;i++)
scanf("%d",&value[i]);
int l=0,r=b,mid;
while(r-l>1)
{
mid=(l+r)/2;
int flag=0;
// printf("mid=%d\n",mid);
for(int i=1;i<=b-mid+1;i++)
{
if(init(i,i+mid-1)) { flag=1; r=mid; break;}
}
if(!flag) l=mid;
}
printf("%d\n",r);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator