HLG 1469 Wrong Answer【二分图.最大独立集】
题意: 给一个n*m的方格,里面放着横竖的单词,问从里面最多可以选出多少组单词并使他们互不冲突。
分析: 二分图最大独立权集,求出最大匹配数,总结点数减去最大匹配即为答案。
View Code
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) char map[2002][2002]; int a[2002][2002]; int link[505]; int v[505]; struct node { int to,next; }q[1000000]; int head[2002]; int tot; void add(int s,int u) { q[tot].to=u; q[tot].next=head[s]; head[s]=tot++; } int find(int x) { int i,k; for(i=head[x];i;i=q[i].next) { k=q[i].to; if(!v[k]) { v[k]=1; if(link[k]==0||find(link[k])) { link[k]=x; return 1; } } } return 0; } int main() { int n,m,t,i,j,x,y,res; char s[1002]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); clr(map); clr(a); clr(link); clr(head); tot=1; for(i=1;i<=n;i++) { scanf("%d%d",&x,&y); scanf("%s",s); for(j=0;s[j];j++) { map[y][x+j]=s[j]; a[y][x+j]=i; } } for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); scanf("%s",s); for(j=0;s[j];j++) if(map[y+j][x]&&map[y+j][x]!=s[j]) add(a[y+j][x],i); } res=0; for(i=1;i<=n;i++) { clr(v); if(find(i)) res++; } printf("%d\n",n+m-res); } return 0; }



浙公网安备 33010602011771号