#include<stdio.h>
#include<string.h>
#define INF 1<<29;
int m,n,ds;
const int maxd 10010;
const int maxb 100010;//注意此处单边乘2 双向边乘4int h[1010],vh[1010],flo,flag,cf_path,he[1010],nu;struct ss{ int v,ne,s;}st[505000];int source,sink;//起点 终点void sap(){ nu=0; memset(he,-1,sizeof(he)); memset(st,0,sizeof(st)); memset(vh,0,sizeof(vh)); memset(h,0,sizeof(h));}void add(int hea,int v,int s){ st[nu].ne=he[hea]; st[nu].v=v; st[nu].s=s; he[hea]=nu++; st[nu].ne=he[v]; st[nu].v=hea; st[nu].s=0; he[v]=nu++;}int dfs(int pos,int cost,int cnt){ if (pos==sink) { return cost; } int j,minh=cnt-1,lv=cost,d; for(j=he[pos];j!=-1;j=st[j].ne) { int v=st[j].v,val=st[j].s; if(val>0) { if (h[v]+1==h[pos]) { if (lv<st[j].s) d=lv; else d=st[j].s; d=dfs(v,d,cnt); st[j].s-=d; st[j^1].s+=d; lv-=d; if (h[source]>=cnt) return cost-lv; if (lv==0) break; } if(h[v]<minh) minh=h[v]; } } if(lv==cost) { --vh[h[pos]]; if(vh[h[pos]]==0) h[source]=cnt; h[pos]=minh+1; ++vh[h[pos]]; } return cost-lv;}int maxflow(int st,int ed,int cnt){ source=st; sink=ed; int ret=0; memset(vh,0,sizeof(vh)); memset(h,0,sizeof(h)); int maxx=10000; vh[st]=cnt; while(h[st]<cnt) { ret+=dfs(st,maxx,cnt); } return ret;}int main(){ int a,b; scanf("%d",&a); int cas=0; while(a--) { sap(); scanf("%d%d",&m,&n); ds=2; int i,j,x,y,z,ii,max=0,all=0; int min=INF; for(i=1;i<=m;i++) { ds++; scanf("%d%d%d",&x,&y,&z); all+=x; add(0,i,x); for(ii=y;ii<=z;ii++) {add(i,ii+m,1);} if(z>max) max=z; if(y<min) min=y; } ds+=max-min+1; for(i=1;i<=max;i++) add(i+m,1004,n); if(maxflow(0,1004,ds)==all) printf("Case %d: Yes\n",++cas); else printf("Case %d: No\n",++cas); printf("\n"); } return 0;}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。