HDU1281 棋盘游戏 二分匹配

来源:互联网 发布:福利王朝邀请码淘宝 编辑:程序博客网 时间:2024/05/21 08:36

做这道题目的时候建议先去做一下poj3041,超级爽的感觉这题目做出来,真心话 先做poj3041,再做这道题目 效果真的很好,这道题是中文的,直接贴代码了


#include<iostream>#include<cstdio>#include<list>#include<algorithm>#include<cstring>#include<string>#include<queue>#include<stack>#include<map>#include<vector>#include<cmath>#include<memory.h>#include<set>#define ll long long#define LL __int64#define eps 1e-8const ll INF=9999999999999;using namespace std;#define M 400000100#define inf 0xfffffff//vector<pair<int,int> > G;//typedef pair<int,int> P;//vector<pair<int,int>> ::iterator iter;////map<ll,int>mp;//map<ll,int>::iterator p;vector<int>G[1012];int mp[1012][1012];int marry[1012];bool vis[1012];int n,m,k;void clear(){memset(marry,-1,sizeof(marry));memset(mp,0,sizeof(mp));for(int i=0;i<1012;i++)G[i].clear();}bool dfs(int x){for(int i=1;i<=m;i++){if(mp[x][i] && !vis[i]){vis[i]=true;if(marry[i]==-1 || dfs(marry[i])){marry[i]=x;return 1;}}}return 0;}int main(void){int Case=0;while(cin>>n>>m>>k){clear();int u,v;for(int i=0;i<k;i++){cin>>u>>v;mp[u][v]=1;}int ans=0;int cnt=0;for(int i=1;i<=n;i++){memset(vis,false,sizeof(vis));if(dfs(i))cnt++;}//先求出最大匹配数,也就是原始的最佳方案for(int i=1;i<=n;i++)//这里开始一定要看懂,{for(int j=1;j<=m;j++){if(mp[i][j]==1){mp[i][j]=0;int temp=0;memset(marry,-1,sizeof(marry));for(int k=1;k<=n;k++){memset(vis,false,sizeof(vis));if(dfs(k))temp++;}mp[i][j]=1;if(cnt>temp)ans++;}}}printf("Board %d have %d important blanks for %d chessmen.\n",++Case,ans,cnt);}}


原创粉丝点击