自己写的超时了,才知道要用二分最大流,然而二分最大流是什么。。。。
未完待续
唔我还是放弃了,这个其实是一道二分的最大匹配题,以我现在对图的熟练度。。。,网上讲二分的全是匈牙利算法,我还是先学最大流吧
这个放一放
未完待续
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct node
{
int pi,si,ei;
}a[600];
int flow[600][600],f[600],pre[600];
int n,m,minn,maxn,sum;
void Bflow()
{
while(1)
{
memset(f,0,sizeof(f));
memset(pre,-1,sizeof(pre));
f[0]=600;
queue<int> q;
q.push(0);
while(!q.empty())
{
// printf("!");
int index=q.front();
if(index==maxn+n+1)
break;
q.pop();
for(int i=0;i<=maxn+n+1;i++)
{
if(f[i]==0&&flow[index][i]>0)
{
f[i]=min(f[index],flow[index][i]);
q.push(i);
pre[i]=index;
}
}
}
if(f[maxn+n+1]==0)
break;
sum=sum+f[maxn+n+1];
int i=maxn+n+1;
int index=pre[i];
while(1)
{
flow[index][i]-=f[maxn+n+1];
flow[i][index]+=f[maxn+n+1];
if(index==0)
break;
i=index;
index=pre[i];
}
}
// printf("%d\n",sum);
}
int main()
{
int t,num;
scanf("%d",&t);
for(int tt=1;tt<=t;tt++)
{
scanf("%d %d",&n,&m);
sum=0;
maxn=0;
minn=600;
num=0;
memset(flow,0,sizeof(flow));
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&a[i].pi,&a[i].si,&a[i].ei);
maxn=max(maxn,a[i].ei);
minn=min(minn,a[i].si);
num+=a[i].pi;
}
for(int i=minn;i<=maxn;i++)
flow[i][maxn+n+1]=m;
for(int i=1;i<=n;i++)
{
flow[0][maxn+i]=a[i].pi;
for(int j=a[i].si;j<=a[i].ei;j++)
flow[maxn+i][j]=1;
}
Bflow();
if(sum==num)
printf("Case %d: Yes\n",tt);
else
printf("Case %D: No\n",tt);
printf("\n");
}
return 0;
}
/*
3
4 3
1 3 5
1 1 4
2 3 7
3 5 9
*/