Machine Schedule ssl 1342/poj 1325 最小覆盖问题

来源:互联网 发布:淘宝上的网红店有哪些 编辑:程序博客网 时间:2024/05/14 07:09

Description

  我们现在有两台机器,A和B。 A机器有n个工作模式,分别为 mode_0、mode_1….mode_n-1,B机器有m个工作模式:mode_0、mode_1….mode_m-1,我们现在有一些工作,每个工作可以用一个三元组来描述(i,x, y ),表示这个工作的编号为i,它可以在A机器的mode_x下或B机器的mode_y模式下被完成。
  我们现在有t个工作,去交给A、B两机器完成,机器如果改变一个模式需要人工去操作…
  请你排出工作表,以使人工操作的次数最少。

Input

n,m,k (n, m < 100) and k (k < 1000).
下接k行描述这k件工作。

Output

人工操作最少次数。

分析

和vijos 1204 CoVH之柯南开锁是一个道理
不过要处理一下连接0状态的情况。(注意起始时,机器都处在模式0!!)

代码

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;struct{    int x,y;    int next;}edge[2001];int ls[2001];int st[2001];int v[2001];int n,m,num;int dfs(int r){    int i=ls[r];    while (i!=0)    {        if (v[edge[i].y]==0)        {            int k=st[edge[i].y];            st[edge[i].y]=r;            v[edge[i].y]=1;            if ((k==0)||(dfs(k)==1))    return 1;            st[edge[i].y]=k;        }        i=edge[i].next;    }    return 0;}void lalala(){    for (int i=1;i<=n;i++){        memset(v,0,sizeof(v));        int j;        j=dfs(i);    }    return;}int main(){    while (1==1){        memset(ls,0,sizeof(ls));        memset(edge,0,sizeof(edge));        memset(st,0,sizeof(st));        scanf("%d",&n);        if (n==0) return 0;        scanf("%d%d",&m,&num);        int nm=0;        for (int i=1;i<=num;i++)        {            int x,y,z;            scanf("%d%d%d",&z,&x,&y);            if ((x==0)||(y==0))                continue;            nm++;            edge[nm].x=x;            edge[nm].y=n+y;            edge[nm].next=ls[x];            ls[x]=nm;        }        int ans=0;        lalala();        for (int i=n+1;i<=n+m;i++)            if (st[i]!=0)   ans++;        printf("%d\n",ans);    }}
0 0
原创粉丝点击