二分匹配简单题,看懂题意,建图比较重要。
#include<stdio.h> #include<string.h> #define maxn 1100 int map[maxn][maxn]; int a[maxn],b[maxn],match[maxn],vis[maxn]; int n,m; void makemap() { int i,j,k; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { for(k=1;k<=m;k++) { if(a[i]+a[j]==b[k]) { map[i][j]=1; } } } } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%d ",map[i][j]); printf("\n"); } } int dfs(int u) { int i,j; for(i=1;i<=n;i++) { if(!vis[i]&&map[u][i]) { vis[i]=1; if(match[i]==-1||dfs(match[i])) { match[i]=u; return 1; } } } return 0; } int main() { int i,j,t; scanf("%d",&t); while(t--) { memset(map,0,sizeof(map)); scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=m;i++) scanf("%d",&b[i]); makemap(); int ans=0; memset(match,-1,sizeof(match)); for(i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } printf("%d\n",ans/2); } }
时间: 2024-10-08 10:27:42