• hdu 1150 最小点覆盖


    题目大意;有两台机器A和B以及N个需要运行的任务。每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行。如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需要设置为模式yi。每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。
     
    注意状态为0的即可
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 using namespace std;
     5 const int MAXN = 510;
     6 int uN,vN;//u,v的数目,使用前面必须赋值
     7 int g[MAXN][MAXN];//邻接矩阵
     8 int linker[MAXN];
     9 bool used[MAXN];
    10 bool dfs(int u)
    11 {
    12     for(int v = 0; v < vN;v++)
    13     if(g[u][v] && !used[v])
    14     {
    15         used[v] = true;
    16         if(linker[v] == -1 || dfs(linker[v]))
    17         {
    18             linker[v] = u;
    19             return true;
    20         }
    21     }
    22     return false;
    23 }
    24 int hungary()
    25 {
    26     int res = 0;
    27     memset(linker,-1,sizeof(linker));
    28     for(int u = 0;u < uN;u++)
    29     {
    30         memset(used,false,sizeof(used));
    31         if(dfs(u))res++;
    32     }
    33     return res;
    34 }
    35 int main()
    36 {
    37     int i,j,k;
    38     //freopen("1.in","r",stdin);
    39     while(scanf("%d",&uN)!=EOF)
    40     {
    41         if(uN==0)   break;
    42         scanf("%d%d",&vN,&k);
    43         int p,q;
    44         memset(g,0,sizeof(g));
    45         while(k--)
    46         {
    47             scanf("%d%d%d",&i,&p,&q);
    48             if(p>0&&q>0)    g[p][q]=1;
    49         }
    50         printf("%d
    ",hungary());
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    算法:最小公倍数的求解方法
    使用C语言中qsort()函数对浮点型数组无法成功排序的问题
    用两个栈模拟实现一个队列
    单链表反向查找
    单链表逆序
    斐波那契(Fibonacci)数列的几种计算机解法
    最大子列和问题
    Visual Studio个人常用快捷键
    数字根(digital root)
    秦九韶算法(霍纳算法)求解多项式
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4314590.html
Copyright © 2020-2023  润新知