最大流:HDU-3572 ( Tas…

来源:互联网 发布:2016淘宝视频开店教程 编辑:程序博客网 时间:2024/06/15 19:41
#include  
#include  
#include  
#include  
#include  
#define INF 0x7fffffff 
using namespace std; 
const int MAXN = 1020; 
const int MAXM = MAXN*MAXN; 
struct edge{    int  to, c;    int next;}edge[MAXM]; 
int size,head[MAXN]; 
void addEdge(int from, int to, int c
{   edge[size].to = to;    edge[size].c = c;    edge[size].next = head[from]; 
     head[from] = size++; 
   edge[size].to = from;    edge[size].c = 0;    edge[size].next = head[to]; 
        head[to] = size++; 
} 
int n,m,ans,Max; int h[MAXN],gap[MAXN],cur[MAXN],pre[MAXN]; 
int SAP_GAP(int start,int end,int N
{   int cur_flow,flow_ans=0,u,tmp,neck,i; 
   memset(h,0,sizeof(h));    memset(gap,0,sizeof(gap));    memset(pre,-1,sizeof(pre)); 
         for(i=0;i<=N;i++)        cur[i]=head[i]; 
   gap[0]=N;    u=start;
        while(h[start]<</font>N
      {   if(u==end
                 {   cur_flow=INF; 
                           for(i=start;i!=end;i=edge[cur[i]].to
                  { if(cur_flow>edge[cur[i]].c{                    neck=i;                    cur_flow=edge[cur[i]].c } }
                         for(i=start;i!=end;i=edge[cur[i]].to
                   {                tmp=cur[i];                edge[tmp].c-=cur_flow;                edge[tmp^1].c+=cur_flow;            } 
                    flow_ans+=cur_flow;            u=neck
          } 
                  for(i=cur[u];i!=-1;i=edge[i].next) 
                    if(edge[i].c&&h[u]==h[edge[i].to]+1)  break; 
                  if(i!=-1 
         {   cur[u]=i;            pre[edge[i].to]=u;            u=edge[i].to;        }
                  else 
                {   gap[h[u]]--;            if(gap[h[u]]==0)  break;            cur[u]=head[u];
                 for(tmp=N,i=head[u];i!=-1;i=edge[i].next) 
                        if(edge[i].c)                    tmp=min(tmp,h[edge[i].to]); 
                        h[u]=tmp+1
                  ++gap[h[u]]; 
                   if(u!=start) u=pre[u]; 
               
      } 
  return flow_ans
}
 void init() 
{
  int  pi, si, ei; 
  scanf("%d%d", &n, &m); 
  size = 0;ans = 0;Max = 0; 
  memset(head, -1, sizeof(head)); 
  for (int i = 1; i <= n; i++) 
  {   scanf("%d%d%d", &pi, &si, &ei); 
      ans += pi; 
      addEdge(0, i, pi);
      Max = max(Max, ei);
      for (int j = si; j <= ei; j++)
      {     addEdge(i, n + j, 1);        } 
  } 
  for (int i = 1; i <= Max; i++)        addEdge(n + i,n+Max+1, m); 
} 
int main()
 {    //freopen("in.txt","r",stdin); 
     int test;    int ans_s; 
     scanf("%d", &test); 
     for (int i = 0; i <</font> test; i++) 
     {
          init(); 
          ans_s=SAP_GAP(0,n+Max+1,n+Max+2); 
         if ( ans_s == ans)            printf("Case %d: Yes\n\n", i+1); 
           else            printf("Case %d: No\n\n", i+1); 
        } 
     return 0
}
0 0