POJ 1325 Machine Schedule(匈牙利—最小点覆盖)

来源:互联网 发布:东北大学软件学院好吗 编辑:程序博客网 时间:2024/05/16 11:24

题目连接:POJ 1325 Machine Schedule

最小点覆盖,注意开始是在零状态,邻接表好快哦,0ms~

#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAX_N = 1000 + 50;const int MAX_M = 100 + 10;struct Edge{    int v, next;};Edge e[MAX_N];int head[MAX_M], link[MAX_M], cnt, n, m, k;bool vis[MAX_M];void addEdge(int u, int v){    e[cnt].v = v;    e[cnt].next = head[u];    head[u] = cnt++;}bool DFS(int u){    for(int i = head[u]; i != -1; i = e[i].next)    {        if(!vis[e[i].v])        {            vis[e[i].v] = 1;            if(link[e[i].v] == -1 || DFS(link[e[i].v]))            {                link[e[i].v] = u;                return true;            }        }    }    return false;}int MaxMatch(){    int ans = 0;    memset(link, -1, sizeof(link));    for(int i = 0; i < n; i++)    {        memset(vis, 0, sizeof(vis));        if(DFS(i))            ans++;    }    return ans;}int main(){    while(scanf("%d", &n) != EOF && n)    {        scanf("%d%d", &m, &k);        memset(head, -1, sizeof(head));        cnt = 0;        int u, v, num;        for(int i = 0; i < k; i++)        {            scanf("%d%d%d", &num, &u, &v);            if(u == 0 || v == 0)                continue;            addEdge(u, v);        }        printf("%d\n", MaxMatch());    }    return 0;}


0 0
原创粉丝点击