poj 2060(最小路径覆盖)
1 // File Name: 2060.cpp 2 // Author: Missa 3 // Created Time: 2013/2/11 星期一 17:11:30 4 5 //最小路径覆盖数=顶点数-二分图最大匹配数 6 #include<iostream> 7 #include<cstdio> 8 #include<cstring> 9 #include<algorithm> 10 #include<cmath> 11 #include<queue> 12 #include<stack> 13 #include<string> 14 #include<vector> 15 #include<cstdlib> 16 #include<map> 17 using namespace std; 18 19 const int maxn = 5e2+5; 20 int n; 21 struct Cust 22 { 23 int src; 24 int x1,y1,x2,y2; 25 int end; 26 }cust[maxn]; 27 //*******************匈牙利算法************************* 28 int nx,ny; 29 bool vis[maxn]; 30 int ma[maxn][maxn]; 31 int link[maxn]; 32 bool dfs(int x) 33 { 34 for(int y=1;y<=ny;y++) 35 { 36 if(!vis[y] && ma[x][y]) 37 { 38 vis[y]=1; 39 if(link[y]==-1 || dfs(link[y])) 40 { 41 link[y]=x; 42 return true; 43 } 44 } 45 } 46 return false; 47 } 48 int maxmatch() 49 { 50 int c=0; 51 memset(link,-1,sizeof(link)); 52 for(int x=1;x<=nx;x++) 53 { 54 memset(vis,0,sizeof(vis)); 55 if(dfs(x)) c++; 56 } 57 return c; 58 } 59 //****************************************************** 60 bool ok(int i,int j) 61 { 62 if(cust[i].end+abs(cust[i].x2-cust[j].x1)+abs(cust[i].y2-cust[j].y1)<cust[j].src) 63 return true; 64 return false; 65 } 66 int main() 67 { 68 int t; 69 scanf("%d",&t); 70 while(t--) 71 { 72 scanf("%d",&n); 73 memset(cust,0,sizeof(cust)); 74 for(int i=1;i<=n;i++) 75 { 76 int a,b; 77 scanf("%d:%d",&a,&b); 78 cust[i].src=a*60+b; 79 scanf("%d%d%d%d",&cust[i].x1,&cust[i].y1,&cust[i].x2,&cust[i].y2); 80 cust[i].end=cust[i].src+abs(cust[i].x1-cust[i].x2)+abs(cust[i].y1-cust[i].y2); 81 } 82 memset(ma,0,sizeof(ma)); 83 for(int i=1;i<=n;i++) 84 { 85 for(int j=1;j<=n;j++) 86 { 87 if(i==j) continue; 88 if(ok(i,j)) ma[i][j]=1; 89 } 90 } 91 nx=ny=n; 92 printf("%d\n",n-maxmatch()); 93 } 94 return 0; 95 }