zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    变量的创建和初始化
    HDU 1114 Piggy-Bank (dp)
    HDU 1421 搬寝室 (dp)
    HDU 2059 龟兔赛跑 (dp)
    HDU 2571 命运 (dp)
    HDU 1574 RP问题 (dp)
    HDU 2577 How to Type (字符串处理)
    HDU 1422 重温世界杯 (dp)
    HDU 2191 珍惜现在,感恩生活 (dp)
    HH实习 acm算法部 1689
  • 原文地址:https://www.cnblogs.com/acSzz/p/2717344.html
Copyright © 2011-2022 走看看