[二分匹配]poj 1719 Shooting Contest

来源:互联网 发布:js给input value赋值 编辑:程序博客网 时间:2024/05/21 23:37
/**[二分匹配]poj 1719 Shooting Contest r*c 的格子矩阵,有C发子弹,每列格子有2个白色的方块,每一列打一个白色格子,才能把所有的行全部打到,如果行全部打到而且有多余的列,那么这列随便打一个方块就可以了,二分匹配,输出匹配方案*/#include <stdio.h>#include <string.h>#include <limits.h>#include <algorithm>using namespace std;const int MAXN = 1001;int uN,vN;bool g[MAXN][MAXN];int xM[MAXN],yM[MAXN];bool chk[MAXN];bool dfs(int u){    for(int v = 1; v <= vN; ++v)        if(g[u][v] && !chk[v])        {            chk[v] = 1;            if(yM[v] == -1 || dfs(yM[v]))            {                yM[v] = u;                xM[u] = v;                return 1;            }        }    return 0;}int MaxMatch(){    int u,ret = 0;    memset(xM,-1,sizeof(xM));    memset(yM,-1,sizeof(yM));    for(u = 1; u <= uN; ++u)        if(xM[u]== -1)        {            memset(chk,0,sizeof(chk));            if(dfs(u))                ret ++;        }    return ret;}int main(){ //   freopen("1.in","r",stdin);    int i,j,k,r,c,t,cc[MAXN][2],res[MAXN];    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&r,&c);        memset(g,0,sizeof(g));        for(i = 1; i <= c; ++i)        {            scanf("%d%d",&j,&k);            cc[i][0] = j;            cc[i][1] = k;            g[j][i] = g[k][i] = 1;        }        uN = r;        vN = c;        if(c < r)            k = -1;        else            k = MaxMatch();        if(k < r)        {            puts("NO\n");            continue;        }        for(i = 1; i <= c; ++i)            res[i] = yM[i] == -1 ? cc[i][0] : yM[i];        for(i = 1; i < c; ++i)            printf("%d ",res[i]);        printf("%d\n",res[i]);    }    return 0;}

原创粉丝点击