hdu1150 最小点覆盖

来源:互联网 发布:软件源在哪 编辑:程序博客网 时间:2024/05/23 21:46

题目链接Machine Schedule


有A和B两个机器,每个机器有不同工作模式,有很多任务,每个任务可以自在A上以mode_i运行或者是在B上以mode_j运行,每次换mode都要重启机器

给出k个任务,要求怎么安排才能让重启次数最少


最小点覆盖:

最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联。可以证明:最少的点(即覆盖数)=最大匹配数


#include <iostream>#include <stdio.h>#include <memory.h>#include <vector>using namespace std;const int maxn=200+5;const int maxk=1005;int link[maxn+5];bool vis[maxk];int m,n,k;vector<int>E[maxk];int dfs(int u){    for(int i=0;i<E[u].size();i++){        int v=E[u][i];        if(!vis[v]){            vis[v]=true;            if(link[v]==-1||dfs(link[v])){                link[v]=u;                return 1;            }        }    }    return 0;}int hungry(){    int ans=0;    memset(link,-1,sizeof(link));    for(int i=1;i<n;i++){        memset(vis,false,sizeof(vis));        ans+=dfs(i);    }    return ans;}int main(){    //freopen("in.txt","r",stdin);    int a,b,c;    while(scanf("%d",&n)!=EOF&&n){        scanf("%d%d",&m,&k);        for(int i=1;i<n;i++)E[i].clear();        for(int i=0;i<k;i++){            scanf("%d%d%d",&a,&b,&c);            if(b!=0&&c!=0)E[b].push_back(c);        }        printf("%d\n",hungry());    }    return 0;}


0 0
原创粉丝点击