POJ 2060

来源:互联网 发布:单词社交网络坑人 编辑:程序博客网 时间:2024/05/23 14:30

最小路径覆盖数=顶点数—最大匹配数。

#include<string.h>#include<cstdio>#include<vector>#include<cmath>#include<iostream>using namespace std;struct P{int ti;int a,b,c,d;};P A[505];bool used[505],map[505][505];int Link[505],n;int dfs(int x){int i,j;for(i=0;i<n;i++)if(map[x][i]&&!used[i]){used[i]=1;if(Link[i]==-1||dfs(Link[i])){Link[i]=x;return 1;}}return 0;}int fun(){int i,num=0;memset(Link,-1,sizeof(Link));for(i=0;i<n;i++){memset(used,0,sizeof(used));if(dfs(i))num++;}return n-num;}bool pd(int x,int y){int temp;if(x==y)return 0;temp=abs(A[x].a-A[x].c)+abs(A[x].b-A[x].d)+A[x].ti;temp+=abs(A[x].c-A[y].a)+abs(A[x].d-A[y].b);if(temp<A[y].ti)return 1;return 0;}int main(){int h,m,N;cin>>N;while(N--){cin>>n;for(int i=0;i<n;i++){scanf("%d:%d",&h,&m);A[i].ti=h*60+m;cin>>A[i].a>>A[i].b>>A[i].c>>A[i].d;}for(int i=0;i<n;i++){for(int j=0;j<n;j++)map[i][j]=pd(i,j);}cout<<fun()<<endl;}return 0;}