HDU1281 二分匹配 + 最需边

来源:互联网 发布:4年级网络简介阅读答案 编辑:程序博客网 时间:2024/05/02 00:01
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281

题意:给出可放车的点坐标,问最多可以放多少个车(车可以互相攻击),为了达到放车数最多有多少个点是必须放车的。。。


思路:二分最大匹配 + 必须边。。。


#include<cstdio>#include<stdlib.h>#include<string.h>#include<string>#include<map>#include<cmath>#include<iostream>#include <queue>#include <stack>#include<algorithm>#include<set>using namespace std;#define INF 1e8#define eps 1e-8#define LL long long#define maxn 100010#define mol 1000000007int n,m,k;int a[110],b[110],ma[110][110],vis[110],ans[110];int dfs(int id){    for(int i=1;i<=m;i++){    if(vis[i]==0&&ma[id][i]){    vis[i]=1;if(ans[i]==0||dfs(ans[i])){   ans[i]=id;   return 1;}}}return 0;}int  match(){    int sum=0;   for(int i=1;i<=n;i++)   {       memset(vis,0,sizeof(vis));   if(dfs(i)) sum++;   }  return sum;}int main(){int Case=1;while(~scanf("%d%d%d",&n,&m,&k)){   memset(ma,0,sizeof(ma));   memset(ans,0,sizeof(ans));   int x,y,i,j,num=0;   for(i=1;i<=k;i++)   {      scanf("%d%d",&a[i],&b[i]);  ma[a[i]][b[i]]=1;   }   int sum=match();   int temp;   for(i=1;i<=k;i++)   {       memset(ans,0,sizeof(ans));   ma[a[i]][b[i]]=0;   int d=match();   ma[a[i]][b[i]]=1;   if(d!=sum)       num++;   }   printf("Board %d have %d important blanks for %d chessmen.\n",Case++,num,sum);}return 0;}


0 0
原创粉丝点击