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; }