#include<stdio.h> #include<string.h> #include<queue> using namespace std; #define inf 0x3fffffff #define N 4000 struct node { int u,v,w,next; }bian[N*N*4]; int head[N],yong,n,s,t; void init() { memset(head,-1,sizeof(head)); yong=0; } void addedge(int u,int v,int w) { bian[yong].u=u; bian[yong].v=v; bian[yong].w=w; bian[yong].next=head[u]; head[u]=yong++; } int d[N]; int bfs() { int i,cur,v; queue<int>q; memset(d,0,sizeof(d)); q.push(s); d[s]=1; while(!q.empty()) { cur=q.front(); q.pop(); for(i=head[cur];i!=-1;i=bian[i].next) { v=bian[i].v; if(bian[i].w&&!d[v]) { d[v]=d[cur]+1; if(v==t) return 1; q.push(v); } } } return 0; } int Min(int a,int b) { return a>b?b:a; } int dfs(int u,int limit) { int cost=0,v,i,flow; if(u==t)//注意 return limit; for(i=head[u];i!=-1;i=bian[i].next) { v=bian[i].v; if(bian[i].w&&d[v]==d[u]+1) { flow=dfs(v,Min(limit-cost,bian[i].w)); if(flow>0) {// bian[i].w-=flow; bian[i^1].w+=flow; cost+=flow; if(limit==cost)//如果已经搜到了满流就跳出 break; } else d[v]=-1;//如果流量等于零,再遇到这个点就进行不下去了 } } return cost; } int dinic() { int sum=0; while(bfs())//建层次图 sum+=dfs(s,inf);//多次dfs搜索s-t增光路求可行流 return sum; } int main() { int tt,m,i,j,k,ma,a,b,c,sum,f=0; scanf("%d",&tt); while(tt--) { init(); scanf("%d%d",&n,&m); ma=-1; s=0;sum=0; for(i=1;i<=n;i++) { scanf("%d%d%d",&a,&b,&c); sum+=a; addedge(s,i,a);//源点与任务建边 addedge(i,s,0); if(ma<c)ma=c; for(j=b;j<=c;j++) { addedge(i,n+j,1);//任务与时间点建边 addedge(n+j,i,0); } } t=n+ma+1; for(i=1;i<=ma;i++) { addedge(n+i,t,m);//时间点与汇点建边 addedge(t,n+i,0); } k=dinic();//跑一边最大流 if(k==sum) printf("Case %d: Yes ",++f); else printf("Case %d: No ",++f); printf(" "); } return 0; }