poj 1422 最小路徑覆蓋

題意:有向圖,傘兵降臨某項點可以遍歷這個點的子樹,求最少的傘兵
解法:最小路徑覆蓋

匈牙利算法 節點數-最大匹配數

  1. /************************************************************************* 
  2.     > File Name: poj1422.cpp 
  3.     > Author: cy 
  4.     > Mail: [email protected]  
  5.     > Created Time: 14/11/9 19:33:21 
  6.  ************************************************************************/ 
  7.  
  8. #include<iostream> 
  9. #include<cstring> 
  10. #include <algorithm> 
  11. #include<cstdlib> 
  12. #include<vector> 
  13. #include<cmath> 
  14. #include<stdlib.h> 
  15. #include<iomanip> 
  16. #include<list> 
  17. #include<deque> 
  18. #include<map> 
  19. #include <stdio.h> 
  20. #include <queue> 
  21.  
  22. const int maxn=1000+5
  23.  
  24. #define inf 0x3f3f3f3f 
  25.   #define INF 0x3FFFFFFFFFFFFFFFLL 
  26. #define rep(i,n) for(i=0;i<n;i++) 
  27.  #define reP(i,n) for(i=1;i<=n;i++) 
  28.  
  29. #define ull unsigned long long 
  30.  #define ll long long 
  31.  
  32. #define cle(a) memset(a,0,sizeof(a)) 
  33.  
  34. using namespace std; 
  35. bool bmap[maxn][maxn];  
  36. bool bmask[maxn];  
  37. int n;  
  38. int cx[maxn],cy[maxn];  
  39. int findpath(int u){  
  40.     int i,j;  
  41.     rep(i,n)if(bmap[u][i]&&!bmask[i]){  
  42.         bmask[i]=1;  
  43.         if(cy[i]==-1||findpath(cy[i])){  
  44.             cy[i]=u;cx[u]=i;return 1;  
  45.         }  
  46.     }  
  47.     return 0;  
  48. }  
  49. int maxmatch(){  
  50.     int res=0;  
  51.     int i,j;  
  52.     rep(i,n)cx[i]=-1,cy[i]=-1;  
  53.     rep(i,n)if(cx[i]==-1){  
  54.         rep(j,n)bmask[j]=0;  
  55.         res+=findpath(i);  
  56.     }  
  57.     return res;  
  58. }  
  59. int main() 
  60. #ifndef ONLINE_JUDGE 
  61.      freopen("in.txt","r",stdin); 
  62.      //freopen("out.txt","w",stdout); 
  63. #endif 
  64.     int T; 
  65.     cin>>T; 
  66.     while(T--) 
  67.     { 
  68.         cin>>n; 
  69.         cle(bmap); 
  70.         int m; 
  71.         scanf("%d",&m); 
  72.         while(m--) 
  73.         { 
  74.             int u,v; 
  75.             scanf("%d%d",&u,&v); 
  76.             bmap[u-1][v-1]=1
  77.         } 
  78.         printf("%d\\n",n-maxmatch()); 
  79.     } 
  80.     return 0
  81. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章