poj 2060

/*
  poj 2060   建图: 如果 运完第一个顾客后 从 a能赶到b时,且还没到达第二个顾客的出发时间
   

*/

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>

using namespace std;

const int Maxn=2005;
vector<int>g[Maxn];

bool visted[Maxn];
int link[Maxn];
int n;
struct node
{
  int time;
  int x1,y1;
  int x2,y2;       
}a[Maxn];


int dfs(int x)
{
 for(int i=0;i<g[x].size();i++)
 {
    int e=g[x][i];
    
    if(!visted[e])
    {
      visted[e]=1;
      if(link[e]==-1 || dfs(link[e]))              
      {
         link[e]=x;
         return 1;               
      }                  
                  
    }        
         
         
 }    
    
    return 0;
}

int main()
{
    
    int t,x,y,x1,y1,x2,y2;
    scanf("%d",&t);
     while(t--)
    {
       scanf("%d",&n);
       for (int i = 0 ; i <= n ; i ++ )g[i].clear() ;
       
       memset(visted,0,sizeof(visted));
       memset(link,-1,sizeof(link));
       for(int i=0;i<n;i++)
       {
         scanf("%d:%d",&x,&y);
         int time=60*x+y;    
         a[i].time=time;
         
         scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
         a[i].x1=x1;
         a[i].y1=y1;
         
         a[i].x2=x2;
         a[i].y2=y2;
       }
      
     // printf("*\n");
        for(int i=0;i<n;i++)
        {
          for(int j=i+1;j<n;j++)
          {
               int  time1=abs(a[i].x2-a[i].x1)+abs(a[i].y1-a[i].y2);
               
               int time2=abs(a[j].x1-a[i].x2)+abs(a[j].y1-a[i].y2);
               
               if(a[i].time+time1+time2<a[j].time)
               g[i].push_back(j);
          }                
        
        }
        
      
        int ans=0;
        for(int i=0;i<n;i++)
        {
          memset(visted,0,sizeof(visted));
          ans+=dfs(i);                
        }
        
        printf("%d\n",n-ans);
        
      
      
              
    }
    
    
    
return 0;    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值