1. 程式人生 > >BZOJ1191: [HNOI2006]超級英雄Hero

BZOJ1191: [HNOI2006]超級英雄Hero

text clas get void font name lin ins family

【傳送門:BZOJ1191】


簡要題意:

給出m個問題,給出n個錦囊,每個問題可以用兩種錦囊解決(有可能這兩種錦囊是同一種,這就很尷尬,可能出數據的神犇有點兒懶),但每種錦囊只能用一次,而且只有解決了前面的問題才能解決後面的問題,求出最多能解決多少問題


題解:

就是很裸的二分圖匹配啦,直接匈牙利。


參考代碼:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using
namespace std; struct node { int x,y,next; }a[2100];int len,last[2100]; int match[2100]; void ins(int x,int y) { len++; a[len].x=x;a[len].y=y; a[len].next=last[x];last[x]=len; } bool chw[2100]; bool findmuniu(int x) { for(int k=last[x];k;k=a[k].next) { int y=a[k].y;
if(chw[y]==true) { chw[y]=false; if(match[y]==0||findmuniu(match[y])==true) { match[y]=x; return true; } } } return false; } int main() { int n,m; scanf("%d%d",&n,&m); memset(match,
0,sizeof(match)); len=0;memset(last,0,sizeof(last)); for(int i=1;i<=m;i++) { int y1,y2; scanf("%d%d",&y1,&y2); y1++;y2++; if(y1==y2) ins(i,y1+m); else { ins(i,y1+m); ins(i,y2+m); } } int ans=0; for(int i=1;i<=m;i++) { memset(chw,true,sizeof(chw)); if(findmuniu(i)==true) ans++; else break; } printf("%d\n",ans); return 0; }

BZOJ1191: [HNOI2006]超級英雄Hero