hdu 1281 棋盘游戏

来源:互联网 发布:奥菲斯办公软件下载 编辑:程序博客网 时间:2024/06/05 19:28
将行和列的标号组成X和Y集合,然后如果x,y坐标可以放车,就在x和y点之间连一条线,不同行和列车就不会相互攻击,所以求出最大匹配就是所得的最多可放车额个数然后枚举每个点,判断其是否为重要点
#include<iostream>#include<stdio.h>#include<string.h>using namespace std;#define N 102int map[N][N],visit[N],match[N];int n,m,k;struct node{    int x,y;}rc[N*N];bool DFS(int k){    for(int i=1;i<=m;i++){        if(visit[i]||!map[k][i]) continue;        visit[i]=1;        if(!match[i]||DFS(match[i])){            match[i]=k;            return true;        }    }    return false;}int Match(){    memset(match,0,sizeof(match));    int cnt=0;    for(int i=1;i<=n;i++){        memset(visit,0,sizeof(visit));        if(DFS(i)) cnt++;    }    return cnt;}int main(){    int i,t=1;    while(scanf("%d%d%d",&n,&m,&k)!=EOF){        memset(map,0,sizeof(map));        for(i=1;i<=k;i++){            scanf("%d%d",&rc[i].x,&rc[i].y);            map[rc[i].x][rc[i].y]=1;        }        int num=0,ans;        ans=Match();        for(i=1;i<=k;i++){            map[rc[i].x][rc[i].y]=0;            if(ans>Match()) num++;            map[rc[i].x][rc[i].y]=1;        }       printf("Board %d have %d important blanks for %d chessmen.\n",t++,num,ans);    }    return 0;}


0 0
原创粉丝点击