zoukankan      html  css  js  c++  java
  • POJ1422 最小路径覆盖入门

    题意:DAG求最小路径覆盖。

    注意:二分匹配只试用于求DAG的最小路径覆盖, 有环就不行,具体可以理解证明。

    对n个点进行拆点,分成左右两排点,对于边<u, v> 建  <u', v''> 。

    然后 最小路径覆盖 == 总点数n - 最大匹配。 

    简单的证明: 每匹配一对<u,v>就说明u和v在同一条路径上,拿路径数就少1。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    using namespace std;
    const int maxn = 130;
    vector <int> edge[maxn];
    int n, m;
    int pre[maxn];
    bool vis[maxn];
    bool dfs(int u) {
    	for(int i = 0; i < (int) edge[u].size(); i++) {
    		int v = edge[u][i];
    		if(vis[v]) continue;
    		vis[v] = 1;
    		if(pre[v] == -1 || dfs(pre[v])) {
    			pre[v] = u;
    			return 1;
    		}
    	}
    	return 0;
    }
    int main() {
    	int i, cas;
    	scanf("%d", &cas);
    	while(cas--) {
    		scanf("%d%d", &n, &m);
    		int x, y;
    		for(i = 1; i <= n; i++)
    			edge[i].clear();
    		while(m--) {
    			scanf("%d%d", &x, &y);
    			edge[x].push_back(y);
    		}
    		memset(pre, -1, sizeof(pre));
    		int cnt = 0;
    		for(i = 1; i <= n; i++) {
    			memset(vis, 0, sizeof(vis));
    			cnt += dfs(i);
    		}
    		printf("%d
    ", n-cnt);
    	}
    	return 0;
    }
    



  • 相关阅读:
    学习笔记2-查看目录文件
    学习笔记1-基本信息及相关目录
    【图论】二分图最大匹配
    【图论】Dinic算法
    【图论】最小割
    【数据结构】左偏树
    【数学】欧拉定理
    【数据结构】ST表
    【数学】博弈模型
    【字符串】后缀数组
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3306216.html
Copyright © 2011-2022 走看看