poj3041Asteroids 简单二分匹配

来源:互联网 发布:淘宝好评大全50字 编辑:程序博客网 时间:2024/06/06 00:19
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int M = 505;int sign[M][M];int has[M];int link[M];int n, m;int pipei(int x) {    for(int i = 1; i <= n; i++) {        if(!has[i] && sign[x][i]== 1) {                has[i] = 1;      //标记为访问过。            if(!link[i] || pipei(link[i])) {  //寻找增广路。                link[i] = x;  //次对可以匹配成功。                return 1;            }        }    }    return 0;}int main(){    int a, b;    while(scanf("%d%d", &n, &m) != EOF) {        memset(sign, 0, sizeof(sign));        for(int i = 1; i <= m; i++) {            scanf("%d%d", &a, &b);            sign[a][b] = 1;        }       // printf("999\n");        memset(link, 0, sizeof(link));        int ans = 0;        //  printf("999\n");        for(int i = 1; i <= n; i++) {            memset(has, 0, sizeof(has));            if(pipei(i))                ans++;        }        printf("%d\n", ans);    }    return 0;}题意, 站在某个格子上, 可以消灭该行该列的所有敌人,消灭一行或一列的敌人算开一次抢, 问最少需要开多少抢。


0 0
原创粉丝点击