这个题的题意是:在一个城镇中有路口和街道,这些街道是单向的并且不会形成环。每一个路口都会降落一名士兵,这些士兵会沿着街道的方向走。求走完所有路口所需要最少的士兵个数。
归纳这个题可得为,有向无环图的最小路径覆盖数,可以通过匈牙利算法求得。
在建图的过程中,跟无向图的建图类似,但是单向的。
以下是代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <iostream> 2 #include <memory.h> 3 #include <stdio.h> 4 using namespace std; 5 6 bool array[121][121]; 7 int res[121]; 8 bool use[121]; 9 int v1,v2; 10 11 bool find(int i) 12 { 13 int j; 14 for(j=1;j<=v2;j++) 15 { 16 if(array[i][j] && !use[j]) 17 { 18 use[j]=true; 19 if(res[j]==0 || find(res[j])) 20 { 21 res[j]=i; 22 return true; 23 } 24 } 25 } 26 return false; 27 } 28 29 int main() 30 { 31 int num; 32 int insec,street; 33 int i,m,n; 34 int ans; 35 scanf("%d",&num); 36 while(num--) 37 { 38 ans=0; 39 memset(array,false,sizeof(array)); 40 memset(res,0,sizeof(res)); 41 scanf("%d%d",&insec,&street); 42 43 for(i=0;i<street;i++) 44 { 45 scanf("%d%d",&m,&n); //建图 46 array[m][n]=true; 47 } 48 49 v1=v2=insec; 50 for(i=1;i<=v1;i++) 51 { 52 memset(use,false,sizeof(use)); 53 if(find(i)) 54 ans++; 55 } 56 printf("%d\n",v1-ans); 57 } 58 return 0; 59 }