题目传送门:https://www.luogu.org/problemnew/show/P1640
题意:
有n个武器,每一个武器都有两个属性,现在要求你可以任选某一个武器中的任意一个属性(有且只能选一个),求你最多可以选多少个属性,使它们的值是连续的。
思路:
二分图匹配。
注意:一旦无法找到连续的匹配就break。
扫描二维码关注公众号,回复:
64717 查看本文章
代码:
#include<cstdio> #include<cstring> struct node{int x,y,next;} a[2000010]; bool bz[1000010]; int last[1000010],match[1000010]; int m,len=0,ans; void ins(int x,int y) { a[++len].x=x;a[len].y=y;a[len].next=last[x];last[x]=len; } bool find(int x) { for(int i=last[x];i;i=a[i].next) { int y=a[i].y; if(bz[y]) { bz[y]=false; if(!match[y]||find(match[y])) { match[y]=x; return true; } } } return false; } int main() { int x,y; scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%d %d",&x,&y); ins(x,i); ins(y,i); } for(int i=1;i<=10000;i++) { memset(bz,true,sizeof(bz)); if(find(i)) ans++; else break; } printf("%d",ans); }