zoukankan      html  css  js  c++  java
  • POJ 1422 Air Raid(二分图匹配最小路径覆盖)

    POJ 1422 Air Raid

    题目链接

    题意:给定一个有向图,在这个图上的某些点上放伞兵,能够使伞兵能够走到图上全部的点。且每一个点仅仅被一个伞兵走一次。问至少放多少伞兵

    思路:二分图的最小路径覆盖,每一个点拆成两个点,然后依据有向边连边,然后答案为n - 最大匹配数

    代码:

    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    const int N = 125;
    
    int t, n, m;
    vector<int> g[N];
    
    int left[N], vis[N];
    
    bool dfs(int u) {
    	for (int i = 0; i < g[u].size(); i++) {
    		int v = g[u][i];
    		if (vis[v]) continue;
    		vis[v] = 1;
    		if (!left[v] || dfs(left[v])) {
    			left[v] = u;
    			return true;
    		}
    	}
    	return false;
    }
    
    int hungary() {
    	int ans = 0;
    	memset(left, 0, sizeof(left));
    	for (int i = 1; i <= n; i++) {
    		memset(vis, 0, sizeof(vis));
    		if (dfs(i)) ans++;
    	}
    	return ans;
    }
    
    int main() {
    	scanf("%d", &t);
    	while (t--) {
    		scanf("%d%d", &n, &m);
    		for (int i = 1; i <= n; i++) g[i].clear();
    		int u, v;
    		while (m--) {
    			scanf("%d%d", &u, &v);
    			g[u].push_back(v);
    		}
    		printf("%d
    ", n - hungary());
    	}
    	return 0;
    }


  • 相关阅读:
    oracle 的一点累积
    ZT: 网页的一些技巧
    ZT: WEB学习资料
    开源java
    倒序显示文本
    plsql使用之debug
    转 一些shell经验
    lpad rpad
    2018.8.19 2018暑假集训之maxnum
    2018.8.17 题解 2018暑假集训之编辑距离
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4365458.html
Copyright © 2011-2022 走看看