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 }

 

posted @ 2012-07-19 15:49  pushing my way  阅读(468)  评论(0编辑  收藏  举报