DINIC 模板

来源:互联网 发布:淘宝联盟如何推广赚钱 编辑:程序博客网 时间:2024/05/16 06:07

/* ***********************************************
Author :
Created Time :2015/6/18 21:15:12
File Name :8.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 1<<30
#define maxn 10000+10
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;

bool cmp(int a,int b){
return a>b;
}
struct G{
int v,cap,next;
}E[600010];
int p[1100],T,d[1100],t_p[1100];

int Q[1100];
void add(int u,int v,int cap){
E[T].v=v;
E[T].cap=cap;
E[T].next=p[u];
p[u]=T++;
E[T].v=u;
E[T].cap=0;
E[T].next=p[v];
p[v]=T++;
}
bool bfs(int s,int en,int n){
int i,u,v,head,tail;
for(i=0;i<=n;i++)d[i]=-1;
head=tail=0;
d[s]=0;
Q[tail]=s;
while(head<=tail){
u=Q[head++];
for(i=p[u];i+1;i=E[i].next){
v=E[i].v;
if(d[v]==-1&&E[i].cap>0){
d[v]=d[u]+1;
Q[++tail]=v;
}
}
}
return (d[en]!=-1);
}
int dfs(int u,int& en,int f){
if(u==en||f==0)
return f;
int flow=0,temp;
for(;t_p[u]+1;t_p[u]=E[t_p[u]].next){
G& e=E[t_p[u]];
if(d[u]+1==d[e.v]){
temp=dfs(e.v,en,min(f,e.cap));
if(temp>0){
e.cap-=temp;
E[t_p[u]^1].cap+=temp;
flow+=temp;
f-=temp;
if(f==0)break;
}
}
}
return flow;
}
int dinic(int s,int e,int n){
int i,ans=0;
while(bfs(s,e,n)){
for(i=0;i<=n;i++)
t_p[i]=p[i];
ans+=dfs(s,e,INF);
}
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
//freopen("in.txt","r",stdin);
#endif
//freopen("out.txt","w",stdout);
int m,n,task;
int si,ei,pi,maxday,sum;
int t;
scanf("%d",&t);
int cnt=0;
while(t--){
T=0;
memset(p,-1,sizeof p);
maxday=-1;
sum=0;
scanf("%d%d",&task,&m);
for(int i=1;i<=task;i++){
scanf("%d%d%d",&pi,&si,&ei);
sum+=pi;
if(ei>maxday)maxday=ei;
add(0,i,pi);
for(int j=si+task;j<=ei+task;j++){
add(i,j,1);
}
}
int k=maxday+task+1;
for(int i=task+1;i<=maxday+task;i++){
add(i,k,m);
}
if(dinic(0,k,k)==sum)
printf("Case %d: Yes\n",++cnt);
else printf("Case %d: No\n",++cnt);
printf("\n");
}
return 0;
}



0 0