标签:
简单的二分图匹配:
每个位置可以边到这些数字甚至可以边
2 5 1 1 2 3 4 5 6 2 1 2 3 4 5 5
Jerry Tom
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=110; int n,K; struct Edge { int to,next; }edge[maxn*maxn]; int Adj[maxn],Size; void init() { memset(Adj,-1,sizeof(Adj)); Size=0; } void add_edge(int u,int v) { edge[Size].to=v; edge[Size].next=Adj[u]; Adj[u]=Size++; } int linker[maxn]; bool used[maxn]; bool dfs(int u) { for(int i=Adj[u];~i;i=edge[i].next) { int v=edge[i].to; if(!used[v]) { used[v]=true; if(linker[v]==-1||dfs(linker[v])) { linker[v]=u; return true; } } } return false; } int hungary() { int res=0; memset(linker,-1,sizeof(linker)); for(int u=1;u<=n;u++) { memset(used,false,sizeof(used)); if(dfs(u)) res++; } return res; } int a[maxn]; int main() { int T_T; scanf("%d",&T_T); while(T_T--) { scanf("%d%d",&n,&K); init(); for(int i=1;i<=n;i++) { scanf("%d",a+i); for(int j=0;a[i]+j*K<=n;j++) { int v=a[i]+j*K; add_edge(i,v); } } int pp=hungary(); //cout<<"pp: "<<pp<<endl; if(pp==n) puts("Jerry"); else puts("Tom"); } return 0; }
版权声明:来自: 代码代码猿猿AC路 http://blog.csdn.net/ck_boss
HDOJ 5090 Game with Pearls 二分图匹配
标签:
原文地址:http://www.cnblogs.com/gcczhongduan/p/4806829.html