Poj 3041 Asteroids 【最小点覆盖 匈牙利算法 】

来源:互联网 发布:佳能mg6280清零软件 编辑:程序博客网 时间:2024/05/22 14:19

链接:

http://poj.org/problem?id=3041


题解:

这题可以将障碍物的横坐标与纵坐标看成两个点然后连边,然后这题是要选最少条边使所有点都有边相连就是最小点覆盖数。

根据König 定理一个二分图中的最大匹配数等于这个图中的最小点覆盖数。

跑一遍匈牙利算法就有答案了。


#include<iostream>#include <stdio.h>#include <algorithm>#include <cmath>#include<stdlib.h>#include <string.h>#include<queue>#include<set>#include<map>#include<stack>#include<time.h>using namespace std;#define MAX_N 505#define inf 0x7fffffff#define LL long long#define ull unsigned long longconst LL INF = 9e18;const int mod = 100000000;typedef pair<double, double>P;bool G[MAX_N][MAX_N];int n, k;int linker[MAX_N];bool used[MAX_N];bool dfs(int u){    for(int i=1;i<=n;i++) {        if(G[u][i] && !used[i]) {            used[i] = true;            if(!linker[i] || dfs(linker[i])) {                linker[i] = u;                return true;            }        }    }    return false;}int hungary(){    int res = 0;    memset(linker, 0, sizeof(linker));    for(int i=1;i<=n;i++) {        memset(used, false, sizeof(used));        if(dfs(i))            res++;    }    return res;}int main(){    cin >> n >> k;    for(int i=0;i<k;i++) {        int a, b;        scanf("%d%d",&a,&b);        G[a][b] = true;    }    int ans = hungary();    cout << ans << endl;}




0 0
原创粉丝点击