POJ2594(二分匹配+Floyd求传递闭包)

来源:互联网 发布:手机怎么注册淘宝店铺 编辑:程序博客网 时间:2024/04/30 03:08

POJ2594(二分匹配+Floyd求传递闭包)

分类: 图论 64人阅读 评论(0) 收藏 举报

题目:Treasure Exploration

 

很明显是最小路径覆盖,只是必须先要求传递闭包就行了。

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #define N 510  
  4.   
  5. int uN,vN;  
  6.   
  7. int g[N][N];  
  8. int linker[N];  
  9. bool used[N];  
  10.   
  11. bool DFS(int u)  
  12. {  
  13.     int v;  
  14.     for(v=0;v<vN;v++)  
  15.     {  
  16.         if(g[u][v]&&!used[v])  
  17.         {  
  18.             used[v]=true;  
  19.             if(linker[v]==-1||DFS(linker[v]))  
  20.             {  
  21.                 linker[v]=u;  
  22.                 return true;  
  23.             }  
  24.         }  
  25.     }  
  26.     return false;  
  27. }  
  28.   
  29. int Hungary()  
  30. {  
  31.     int u;  
  32.     int ret=0;  
  33.     memset(linker,-1,sizeof(linker));  
  34.     for(u=0;u<uN;u++)  
  35.     {  
  36.         memset(used,false,sizeof(used));  
  37.         if(DFS(u))   ret++;  
  38.     }  
  39.     return ret;  
  40. }  
  41.   
  42. void Floyd(int n)  
  43. {  
  44.     int i,j,k;  
  45.     for(i=0;i<n;i++)  
  46.     {  
  47.         for(j=0;j<n;j++)  
  48.         {  
  49.             if(g[i][j]==0)  
  50.             {  
  51.                 for(k=0;k<n;k++)  
  52.                 {  
  53.                     if(g[i][k]==1&&g[k][j]==1)  
  54.                     {  
  55.                         g[i][j]=1;  
  56.                         break;  
  57.                     }  
  58.                 }  
  59.             }  
  60.         }  
  61.     }  
  62. }  
  63.   
  64. int main()  
  65. {  
  66.     int n,m;  
  67.     int u,v;  
  68.     while(~scanf("%d%d",&n,&m))  
  69.     {  
  70.         if(n==0&&m==0) break;  
  71.         uN=vN=n;  
  72.         memset(g,0,sizeof(g));  
  73.         while(m--)  
  74.         {  
  75.             scanf("%d%d",&u,&v);  
  76.             u--;v--;  
  77.             g[u][v]=1;  
  78.         }  
  79.         Floyd(n);  
  80.         int ans=Hungary();  
  81.         printf("%d\n",n-ans);  
  82.     }  
  83.     return 0;  
  84. }  
原创粉丝点击