最大流:HDU-3572 ( Tas…

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值