标签:style blog http color os io strong for
大意:有n个盒子,告诉你一些嵌套关系,比如a能放到b里 c能放到a里
问最少使多少盒子露在外面
分析:这里要求的是最少DAG的数量,也就是传说中的最小路径覆盖问题
最小路径覆盖:
公式:最小路径覆盖 = 节点个数 - 最大匹配
这儿有一篇关于其解释,
首先给出公式:DAG的最小路径覆盖数=DAG图中的节点数-相应二分图中的最大匹配数.
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int maxn = 505; 7 8 struct Node { 9 int to; 10 int next; 11 }p[maxn * maxn]; 12 int head[maxn * maxn]; 13 int tot; 14 void AddEdge(int u, int v) { 15 p[tot].to = v; 16 p[tot].next = head[u]; 17 head[u] = tot++; 18 } 19 20 int Link[maxn]; 21 int vis[maxn]; 22 23 bool Find(int u) { 24 for(int i = head[u]; i; i = p[i].next) { 25 int v = p[i].to; 26 if(!vis[v]) { 27 vis[v] = 1; 28 if(Link[v] == -1 || Find(Link[v])) { 29 Link[v] = u; 30 return true; 31 } 32 } 33 } 34 return false; 35 } 36 37 int solve(int n) { 38 int cnt = 0; 39 memset(Link, -1, sizeof(Link)); 40 for(int i = 1; i <= n; i++) { 41 memset(vis, 0, sizeof(vis)); 42 if(Find(i)) { 43 cnt++; 44 } 45 } 46 return cnt; 47 } 48 49 int main() { 50 int n, m; 51 int u, v; 52 while(EOF != scanf("%d %d",&n, &m)) { 53 memset(head, 0, sizeof(head)); 54 tot = 1; 55 for(int i = 0; i < m; i++) { 56 scanf("%d %d",&u, &v); 57 AddEdge(u, v); 58 } 59 printf("%d\n",n - solve(n)); 60 } 61 return 0; 62 }
hlg1492盒子【最小路径覆盖】,布布扣,bubuko.com
标签:style blog http color os io strong for
原文地址:http://www.cnblogs.com/zhanzhao/p/3903207.html