hdu 1281 二分匹配

来源:互联网 发布:九阴绝学兽魂进阶数据 编辑:程序博客网 时间:2024/04/29 11:16

题意:

     在图上给出一些点,安放车,让其不相互攻击,求车的最大值!!并求出那些点不可代替!!

构图:

    将各自的x,y坐标提出了,建立边!!xi,yi边的匹配的最大值就是车的数量!!!删除每条边,如果车的数量有所减少则是不可替代的车!!

代码:

#include<iostream>#include<cstdio>#include<memory.h>#include<algorithm>using namespace std;int vis[102],mat[102];int n,m,k,tx,ty,x[102],y[102];int f[1002][1002];int find(int x){    for(int i=f[x][0]; i>=1; i--)    {        int y=f[x][i];        if(!vis[y])        {            if(x==tx&&y==ty) continue;            vis[y]=1;            if(mat[y]==-1||find(mat[y]))            {                mat[y]=x;                return 1;            }        }    }    return 0;}int main (){    int i,j,t;    int m,n,k,ans,cas=1;    while(scanf("%d%d%d",&n,&m,&k)!=EOF)    {        memset(f,0,sizeof(f));        memset(mat,-1,sizeof(mat));        ans=0;        int Max=0;        tx=-1,ty=-1;        for(i=1; i<=k; i++)        {            scanf("%d %d",&x[i],&y[i]);            f[x[i]][++f[x[i]][0]]=y[i];        }        for(i=1; i<=n; i++)        {            memset(vis,0,sizeof(vis));            if(find(i))                Max++;        }        int imp=0;        for(i=1; i<=n; i++)        {            for(t=f[i][0]; t>=1; t--)            {                memset(mat,-1,sizeof(mat));                ans=0;                tx=i;ty=f[i][t];                for(j=1; j<=n; j++)                {                    memset(vis,0,sizeof(vis));                    if(find(j))ans++;                }                if(ans<Max) imp++;            }        }        printf("Board %d have %d important blanks for %d chessmen.\n",cas++,imp,Max);    }    return 0;}/*3 3 41 21 32 12 23 3 41 22 32 13 2*/

原创粉丝点击