poj2060

来源:互联网 发布:淘宝 运营 系统架构 编辑:程序博客网 时间:2024/06/10 13:38

最小路径覆盖 = n -  最大匹配

  1. #include <iostream>  
  2. using namespace std;  
  3. #define MAXV 505  
  4. typedef struct{  
  5.     int ti;  
  6.     int a,b,c,d;  
  7. }TEST;  
  8.   
  9. TEST t[MAXV];  
  10.   
  11. bool map[MAXV][MAXV],use[MAXV];  
  12. int n,link[MAXV];  
  13.   
  14. int dfs(int cap){  
  15.     int i,j;  
  16.     for(i=0;i<n;i++)  
  17.         if(map[cap][i] && !use[i]){  
  18.             use[i]=1;  
  19.             j=link[i];  
  20.             link[i]=cap;  
  21.             if(j==-1 || dfs(j)) return true;  
  22.             link[i]=j;  
  23.         }  
  24.         return false;  
  25. }  
  26.   
  27. int hungary(){  
  28.     int i,num=0;  
  29.     memset(link,-1,sizeof(link));  
  30.     for(i=0;i<n;i++){  
  31.         memset(use,0,sizeof(use));  
  32.         if(dfs(i)) num++;  
  33.     }  
  34.     return n-num;  
  35. }  
  36.   
  37. bool pd(int x,int y){  
  38.     if(x==y) return 0;  
  39.     int tmp=abs(t[x].a-t[x].c)+abs(t[x].b-t[x].d)+t[x].ti;      //做x任务的时间+x任务开始的时间  
  40.     tmp+=abs(t[x].c-t[y].a)+abs(t[x].d-t[y].b);             //做完x任务再做y任务的时间  
  41.     if(tmp<t[y].ti) return 1;  
  42.     return 0;  
  43. }  
  44.   
  45. int main(){  
  46.     int i,j,h,m;  
  47.     int Case;  
  48.     scanf("%d",&Case);  
  49.     while(Case--){  
  50.         scanf("%d",&n);  
  51.         for(i=0;i<n;i++){  
  52.             scanf("%d:%d",&h,&m);  
  53.             t[i].ti=h*60+m;  
  54.             scanf("%d %d %d %d",&t[i].a,&t[i].b,&t[i].c,&t[i].d);  
  55.         }  
  56.   
  57.         for(i=0;i<n;i++){  
  58.             for(j=0;j<n;j++)  
  59.                 map[i][j]=pd(i,j);  
  60.         }  
  61.   
  62.         printf("%d\n",hungary());  
  63.     }  
  64.     return 0;  
  65. }  

原创粉丝点击