标签:
先二分答案,然后建分层图跑最大流,流量是人数则可行
1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int i=l;i>=r;i--) 4 #define link(x) for(edge *j=h[x];j;j=j->next) 5 #define mem(a) memset(a,0,sizeof(a)) 6 #define inf 1e9 7 #define ll long long 8 #define succ(x) (1<<x) 9 #define lowbit(x) (x&(-x)) 10 #define id(x,y) ((y)*n-n+(x)) 11 #define NM 10000 12 #define nm 700000 13 using namespace std; 14 int read(){ 15 int x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();} 17 while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar(); 18 return x*f; 19 } 20 struct edge{ 21 int t,v; 22 edge *next,*rev; 23 }e[nm],*h[NM],*o,*p[NM],*tmp[NM]; 24 void _add(int x,int y,int v){ 25 o->t=y;o->v=v;o->next=h[x];h[x]=o++; 26 } 27 void add(int x,int y,int v){ 28 _add(x,y,v);_add(y,x,0); 29 h[x]->rev=h[y];h[y]->rev=h[x]; 30 } 31 int n,m,k,a[nm],b[nm],c[nm],d[NM],cnt[NM],l,r,tot; 32 bool maxflow(){ 33 int flow=0;edge *j; 34 inc(i,1,tot)tmp[i]=h[i]; 35 cnt[0]=tot; 36 for(int x=1,s=inf;d[x]<tot;){ 37 for(j=tmp[x];j;j=j->next) 38 if(d[j->t]+1==d[x]&&j->v)break; 39 if(j){ 40 s=min(s,j->v);p[j->t]=tmp[x]=j; 41 if((x=j->t)==tot){ 42 for(;x!=1;x=p[x]->rev->t) 43 p[x]->v-=s,p[x]->rev->v+=s; 44 flow+=s;s=inf;if(flow>=k)return true; 45 } 46 }else{ 47 if(!--cnt[d[x]])break; 48 d[x]=tot; 49 link(x)if(d[j->t]+1<d[x]&&j->v) 50 d[x]=d[j->t]+1,tmp[x]=j; 51 cnt[d[x]]++; 52 if(x!=1)x=p[x]->rev->t; 53 } 54 } 55 return false; 56 } 57 bool check(int t){ 58 mem(e);mem(h);o=e;mem(d);mem(p);mem(cnt);mem(tmp);tot=id(n,t+1)+1; 59 inc(i,1,t+1)add(id(n,i),tot,inf); 60 inc(i,1,n)inc(j,1,t)add(id(i,j),id(i,j+1),inf); 61 inc(i,1,m)inc(j,1,t)add(id(a[i],j),id(b[i],j+1),c[i]); 62 return maxflow(); 63 } 64 int main(){ 65 freopen("data.in","r",stdin); 66 n=read();m=read();k=read(); 67 inc(i,1,m){ 68 a[i]=read();b[i]=read();c[i]=read(); 69 } 70 for(l=1,r=100;l<r;){ 71 int _t=l+r>>1; 72 if(check(_t))r=_t;else l=_t+1; 73 } 74 printf("%d\n",r); 75 return 0; 76 }
标签:
原文地址:http://www.cnblogs.com/onlyRP/p/5296540.html