poj2060Taxi Cab Scheme(最小路径覆盖)

来源:互联网 发布:org.apache jar包 编辑:程序博客网 时间:2024/05/16 01:46

题目链接:

http://poj.org/problem?id=2060

思路:

要求最少派几辆车。那么我们就可以先把那些可以接上的车辆订单都建边,建成一个有向无环图,然后我们可以利用二分图最大匹配计算出最大匹配p,然后就可以算出需要的车辆为n-p。

代码:

#include<stdio.h>#include<string.h>#include<algorithm>#include<stdlib.h>using namespace std;const int maxn= 505;int vis[maxn],head[maxn],tot,match[maxn];struct edge{int to,from,next;}e[maxn*maxn];struct node{int hh,mm,a,b,c,d;}p[maxn];void add(int a,int b){e[tot].to=b;e[tot].next=head[a];head[a]=tot++;}bool cmp(node x,node y){if(x.hh==y.hh)return x.mm<y.mm;return x.hh<y.hh;}void init(){tot=0;memset(vis,0,sizeof(vis));memset(head,-1,sizeof(head));memset(match,-1,sizeof(match));}bool dfs(int x){//printf("%d?\n",x);for(int i=head[x];i!=-1;i=e[i].next){if(!vis[e[i].to]){vis[e[i].to]=1;if(match[e[i].to]==-1||dfs(match[e[i].to])){match[e[i].to]=x;return true;}}}return false;}int main(){int T,i,j,k,n,m;scanf("%d",&T);while(T--){init();scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d:%d%d%d%d%d",&p[i].hh,&p[i].mm,&p[i].a,&p[i].b,&p[i].c,&p[i].d);}sort(p+1,p+1+n,cmp);for(i=1;i<=n;i++){for(j=i+1;j<=n;j++){int a,b,c,d,e,f;a=p[i].a;b=p[i].b;c=p[i].c;d=p[i].d;e=p[j].a;f=p[j].b;int xx=abs(a-c)+abs(b-d)+abs(c-e)+abs(d-f);int yy=(p[j].hh-p[i].hh)*60+p[j].mm-p[i].mm;if(xx<yy){add(i,j);}}}int ans=0;for(i=1;i<=n;i++){memset(vis,0,sizeof(vis));if(dfs(i))ans++;}printf("%d\n",n-ans);}}


0 0