题目大意:给定n个锦囊和m个问题,每个问题可以使用给定的两个锦囊之一,必须连续答题,求最多答上多少题
二分图最大匹配,每出现一个问题就向给定的两个锦囊连边,然后匈牙利算法寻找增广路,如果找不到就break
我这SB居然一开始在两个锦囊之间练了条边,然后二分答案……伤不起啊……
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 1010 using namespace std; struct abcd{ int to,next; }table[M<<1]; int head[M],tot; int n,m; int result[M],state[M],T; void Add(int x,int y) { table[++tot].to=y; table[tot].next=head[x]; head[x]=tot; } bool Hungary(int x) { int i; for(i=head[x];i;i=table[i].next) { if(state[table[i].to]==T) continue; state[table[i].to]=T; if( !result[table[i].to] || Hungary(result[table[i].to]) ) { result[table[i].to]=x; return true; } } return false; } int main() { int i,x,y; cin>>n>>m; for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); ++x;++y; Add(i,x);Add(i,y); ++T; if( !Hungary(i) ) break; } cout<<i-1<<endl; }
时间: 2024-10-27 16:04:11