poj 2060

来源:互联网 发布:ubuntu 终端输入中文 编辑:程序博客网 时间:2024/05/21 17:10
/*  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;    }

原创粉丝点击