hdoj1281二分匹配查看是否为关键位置

来源:互联网 发布:php curl 头部 编辑:程序博客网 时间:2024/06/14 17:27
#include <stdio.h>#include <string.h>#include <iostream>using namespace std;#define  MAX_N  105static int G[MAX_N][MAX_N];static int n,m;static int match[MAX_N];static int used[MAX_N];//有向图的匹配方式static bool dfs(int v){//匹配列数for (int i=1;i<=m;++i){if (!used[i]&&G[v][i]){used[i] = 1;if (match[i]==-1||dfs(match[i])){match[i] = v;return true;}}}return false;}static int solve(){int res= 0 ;memset(match,-1,sizeof(match));for (int i=1;i<=n;++i){memset(used,0,sizeof(used));if (dfs(i)) res++;}return res;}int main(){int k;int ncase = 1;while(~scanf("%d %d %d",&n,&m,&k)){int u,v;memset(G,0,sizeof(G));for (int i=1;i<=k;++i){scanf("%d %d",&u,&v);G[u][v] = 1;}int ans2 = solve();//最后最大匹配数目//求解关键位置int ans = 0;for (int i=1;i<=n;++i){for (int j=1;j<=m;++j){int temp;if (G[i][j])//看是否是关键位置{G[i][j]= 0;temp = solve();if (temp<ans2) ans++;G[i][j] = 1;}}}printf("Board %d have %d important blanks for %d chessmen.\n",ncase,ans,ans2);ncase++;}return 0;}

0 0
原创粉丝点击