poj1422_有向图最小路径覆盖数

这个题的题意是:在一个城镇中有路口和街道,这些街道是单向的并且不会形成环。每一个路口都会降落一名士兵,这些士兵会沿着街道的方向走。求走完所有路口所需要最少的士兵个数。

归纳这个题可得为,有向无环图的最小路径覆盖数,可以通过匈牙利算法求得。

在建图的过程中,跟无向图的建图类似,但是单向的。

以下是代码:

 

View Code
 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 }

 

你可能感兴趣的:(poj)