poj 1325 Machine Schedule (最小点覆盖)

poj.org/problem?id=1325

题意:有A和B两种机器,A机器有n种状态,B机器有m种状态。现在有k个需要加工的材料,每种材料可以用A机器的x状态或者是B机器的y状态加工完成,问药加工完所有的材料,需最少改变A和B的多少次状态。A和B的初始状态都为0。
 

题解:最大匹配, 对于 任务 k  若 a 的状态是 i  b 的状态是  j  则 i -> j

这样 每一个任务 表示 一条狐,要完成 所有的任务 且 重启次数最小 ,即求 最小点覆盖。

注意  :一开始的时候机器的状太 为 0  ,所以 遇到 状态为0 的 任务可以 过滤掉

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<set>
 7 #include<map>
 8 #include<queue>
 9 #include<vector>
10 #include<string>
11 #define Min(a,b) a<b?a:b
12 #define Max(a,b) a>b?a:b
13 #define CL(a,num) memset(a,num,sizeof(a));
14 #define eps  1e-6
15 #define inf 10001000
16 
17 #define ll   __int64
18 
19 #define  read()  freopen("data.txt","r",stdin) ;
20 const double pi  = acos(-1.0);
21 const int maxn = 110;
22 
23 using namespace std;
24 int n,m,k;
25 int head[maxn] ;
26 int result[maxn],vis[maxn] ;
27 struct node
28 {
29     int v;
30     int next;
31 }p[maxn*maxn];
32 int cnt ;
33 void add(int u,int v)
34 {
35     p[cnt].v = v;
36     p[cnt].next = head[u];
37     head[u] = cnt++ ;
38 }
39 bool find(int u)
40 {
41 
42     for(int i = head[u];i!= -1;i = p[i].next)
43     {
44         int v = p[i].v ;
45         if(!vis[v])
46         {
47             vis[v] = 1 ;
48             if(result[v] == -1||find(result[v]))
49             {
50                 result[v] = u;
51                 return true;
52             }
53         }
54     }
55     return false ;
56 }
57 int get()
58 {
59     int ans= 0;
60     CL(result,-1);
61     for(int i = 0;i < n;i++)
62     {
63         CL(vis,0);
64         if(find(i))ans++;
65     }
66     return ans ;
67 }
68 int main()
69 {
70     //read() ;
71     int i,x,a,b;
72      while(scanf("%d",&n)!=EOF)
73      {
74          if(n == 0break ;
75          scanf("%d%d",&m,&k) ;
76 
77          CL(head,-1) ;
78          cnt = 0 ;
79          for(i = 0 ; i< k;i++)
80          {
81              scanf("%d%d%d",&x,&a,&b);
82              if(a == 0||b == 0)continue ;
83              add(a,b) ;
84          }
85          int ans = get() ;
86          printf("%d\n",ans) ;
87      }
88 }
原文地址:https://www.cnblogs.com/acSzz/p/2717344.html