【二分图裸题】poj1325机器调度

题目大意:有两个机器A和B,A机器有n个模式,B机器有m个模式,两个机器最初在0模式

然后有k个作业,每个作业有三个参数i,a,b

i代表作业编号,a和b代表第i作业要么在A机器的a模式下完成【或者】在B机器的b模式下完成

问两个机器总共最少变换多少次可以完成所有作业

简单的二分图裸题,但是要注意使用邻接表的时候加上对于b机器初始模式0的判断

而且题上还有数据的问题,有一个点k的值比题中描述大(我开5000过的)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

struct edge{
    int y,next;
}e[5001];

int n,m,k,a,b,c,ecnt,ans;
int head[201],point[201];
bool used[201];

void add(int a,int b)
{
    e[++ecnt].y=b;
    e[ecnt].next=head[a];
    head[a]=ecnt;
}

bool find(int x)
{
    for(int i=head[x];i;i=e[i].next){
        if(used[e[i].y]==0&&e[i].y!=0)
        {
            used[e[i].y]=1;
            if(point[e[i].y]==0||find(point[e[i].y]))
            {
                point[e[i].y]=x;
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    freopen("machine.in","r",stdin);
    freopen("machine.out","w",stdout); 
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=k;++i)
    {
        scanf("%d%d%d",&a,&b,&c);
        add(b,c);
    }
    ans=0;
    memset(point,0,sizeof(point));
    for(int i=1;i<=n;++i){
        memset(used,0,sizeof(used));
        if(find(i))ans++;
    }
    printf("%d",ans);
}

 

posted @ 2017-04-27 18:57  减维  阅读(150)  评论(0编辑  收藏  举报