hdu_3605 Escape 二分图的多重匹配 匈牙利算法

来源:互联网 发布:win10平板软件下载 编辑:程序博客网 时间:2024/05/23 19:17
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 100001int n,m;int limit[11];int g[N][11];int linker[11][N];bool vis[11];int cnt[11];bool dfs(int u){for(int v=1;v<=m;v++){if(!vis[v]&&g[u][v]){vis[v]=1;if(cnt[v]+1<=limit[v]){linker[v][++cnt[v]]=u;return true;}else {for(int j=1;j<=cnt[v];j++){if(dfs(linker[v][j])){linker[v][j]=u;return true;}}}}}return false;}int hungary(){int ans=0;memset(linker,-1,sizeof(linker));memset(cnt,0,sizeof(cnt));for(int i=1;i<=n;i++){memset(vis,0,sizeof(vis));if(!dfs(i)) return 0;//只要有一个不行就行了,不然会超时}return 1;}int main(){while(scanf("%d%d",&n,&m)!=EOF){memset(g,0,sizeof(g));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)scanf("%d",&g[i][j]);}for(int i=1;i<=m;i++)scanf("%d",&limit[i]);int ans=hungary();if(ans==1) printf("YES\n");else printf("NO\n");}return 0;}

各种超时。。。。。

结果发现C++过了,G++一直超时。。。。

这题也可以将每个容量变成一个新的点,转化成一般的二分图匹配,估计会超时。。。

这题用最大流同样可以求解。