POJ1548最小路径覆盖

题意:
      给你一个DAG,然后问你最少多少条路径能覆盖所有需要覆盖的点。


思路:
      最小路径覆盖,太明显了,每个点向它右下方的点连边,然后...没啥难的地方,不说了。


#include<stdio.h>
#include<string.h>


#define N_node 24 * 24 + 10
#define N_edge 24 * 24 * 24 * 24 + 100


typedef struct
{
    int x ,y;
}NODE;


typedef struct
{
    int to ,next;
}STAR;


NODE node[N_node];
STAR E[N_edge];
int list[N_node] ,tot;
int mkdfs[N_node] ,mkgx[N_node];


void add(int a ,int b)
{
    E[++tot].to = b;
    E[tot].next = list[a];
    list[a] = tot;
}


int DFS_XYL(int x)
{
    for(int k = list[x] ;k ;k = E[k].next)
    {
        int to = E[k].to;
        if(mkdfs[to]) continue;
        mkdfs[to] = 1;
        if(mkgx[to] == -1 || DFS_XYL(mkgx[to]))
        {
            mkgx[to] = x;
            return 1;
        }
    }
    return 0;
}




int main ()
{
    int a ,b ,i ,j, nowt ,n;
    while(~scanf("%d %d" ,&a ,&b) && a != -1)
    {
        nowt = 1;
        node[nowt].x = a;
        node[nowt].y = b;
        while(scanf("%d %d" ,&a ,&b) && a && b)
        {
            node[++nowt].x = a;
            node[nowt].y = b;
        }
        n = nowt;
        memset(list ,0 ,sizeof(list));
        tot = 1;
        for(i = 1 ;i <= n ;i ++)
        for(j = 1 ;j <= n ;j ++)
        {
            if(i == j) continue;
            if(node[i].x <= node[j].x && node[i].y <= node[j].y)
            add(i ,j);
        }
        memset(mkgx ,255 ,sizeof(mkgx));
        int Ans = 0;
        for(i = 1 ;i <= n ;i ++)
        {
            memset(mkdfs ,0 ,sizeof(mkdfs));
            Ans += DFS_XYL(i);
        }
        printf("%d " ,n - Ans);
    }
    return 0;
}















原文地址:https://www.cnblogs.com/csnd/p/12062490.html