hdu 3572
#include<cstdio> #include<iostream> #include<algorithm> #define inf 99999999 #define max(a,b) (a)>(b)?(a):(b) using namespace std; int S,sink,oo,T,cnt,n,ans,sum; int c[1000001]; int H[1000001]; int d[1000001]; struct edge{ int u,v,c,next; }; edge a[1000001]; void init() { int i; for(i=0;i<1000001;i++) H[i]=-1; cnt=0; } void add(int u,int v,int c) { a[cnt].u=u; a[cnt].v=v; a[cnt].c=c; a[cnt].next=H[u]; H[u]=cnt++; } void build(int u,int v,int c) { add(u,v,c); add(v,u,0); } int dfs(int u,int flow) { if(u==sink) return flow; int Mindis = T; int tt,res=0,delta; for(tt=H[u];~tt;tt=a[tt].next) { int &v=a[tt].v,&c=a[tt].c; if(c) { if(d[u]==d[v]+1) { delta=dfs(v,min(flow,c)); c-=delta; a[tt^1].c+=delta; res+=delta; flow-=delta; if(d[S]>=T) return res; if(!flow) break; } if(d[v]<Mindis) Mindis=d[v]; } } if(!res) { if(!--c[d[u]]) d[S]=T; d[u] = Mindis+1; c[d[u]]++; } return res; } void sap() { c[0]=T; memset(d,0,sizeof(d)); memset(c,0,sizeof(c)); while(d[S]<T) ans+=dfs(S,oo); } int main() { int i,m,t,pi,si,ei,Max,j; int cases=1; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); S=0; ans=0; Max=0; oo=inf; sum=0; init(); for(i=1;i<=n;i++) { scanf("%d%d%d",&pi,&si,&ei); sum+=pi; build(S,i,pi); for(j=si;j<=ei;++j) build(i,n+j,1); Max=max(Max,ei); } sink=n+Max+1; T=n+Max+2; for(i=1;i<=Max;i++) { build(n+i,sink,m); } sap(); if(ans==sum) printf("Case %d: Yes\n\n",cases++); else printf("Case %d: No\n\n",cases++); } return 0; }
在奔往梦想的路上,我从来都不感疲倦。
posted on 2013-05-06 20:01 ray007great 阅读(124) 评论(0) 编辑 收藏 举报