#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int inf=0x7fffffff;
int n,m,t,cnt;
struct zp
{
int u,v,w,Next;
}Map[1000010];
int dis[1010],head[1010];
void add(int u,int v,int w)
{
Map[cnt].u=u; Map[cnt].v=v; Map[cnt].w=w;
Map[cnt].Next=head[u]; head[u]=cnt++;
Map[cnt].u=v; Map[cnt].v=u; Map[cnt].w=0;
Map[cnt].Next=head[v]; head[v]=cnt++;
}
int BFS()//根据残留网络建立层次图 起点为0记得改
{
memset(dis,0,sizeof(dis));
dis[0]=1;
queue<int> q;
q.push(0);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u]; i!=-1; i=Map[i].Next)
{
int v=Map[i].v;
if(Map[i].w&&!dis[v])
{
dis[v]=dis[u]+1;
if(v==t)
return 1;
q.push(v);
}
}
}
return 0;
}
int dfs(int a,int low)//寻找增广路
{
int cost=0;
if(a==t) return low;
for(int i=head[a]; i!=-1; i=Map[i].Next)
{
int v=Map[i].v;
if(Map[i].w&&dis[a]==dis[v]-1)
{
int tmp=dfs(v,min(low-cost,Map[i].w));
if(tmp>0)
{
Map[i].w-=tmp;
Map[i^1].w+=tmp;//反向边
cost+=tmp;
if(cost==low)
break;
}
else
dis[v]=-1;
}
}
return cost;
}
int dinic()//求最大流
{
int ans=0,s=0;//s为起点
while(BFS())
ans+=dfs(s,inf);
return ans;
}
int main()
{
int ncase,s[505],e[505],p[505];
scanf("%d",&ncase);
int cas=1;
while(ncase--)
{
scanf("%d%d",&n,&m);
int t1=n,t2=0,sum=0;
for(int i=1; i<=n; i++)
{
scanf("%d%d%d",&p[i],&s[i],&e[i]);
t1=min(t1,s[i]);
t2=max(t2,e[i]);
sum+=p[i];
}
cnt=0;
memset(head,-1,sizeof(head));
for(int i=t1;i<=t2;i++)
{
add(0,i,m);
}
for(int i=1;i<=n;i++)
{
for(int j=s[i];j<=e[i];j++)
{
add(j,j+t2,1);
add(j+t2,2*t2,1);
}
}
t=2*t2;
if(sum<=dinic())
printf("Case %d: Yes\n\n",cas++);
else
printf("Case %d: No\n\n",cas++);
}
return 0;
}
dinic网络最大流
最新推荐文章于 2024-09-20 14:41:15 发布