連續攻擊遊戲[最大匹配]
阿新 • • 發佈:2018-12-19
我們將屬性向武器建邊,匈牙利跑最大匹配就可以了
#include<bits/stdc++.h> #define N 1000005 #define M 10005 using namespace std; int n,ans,vis[N],match[N]; int first[N],next[N*2],to[N*2],tot; int read(){ int cnt=0,f=1;char ch=0; while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();} while(isdigit(ch))cnt=cnt*10+(ch-'0'),ch=getchar(); return cnt*f; } void add(int x,int y){ next[++tot]=first[x],first[x]=tot,to[tot]=y; } bool find(int x){ for(int i=first[x];i;i=next[i]){ int t=to[i]; if(vis[t]!=i){ vis[t]=i; if(!match[t] || find(match[t])){ match[t]=x; return true; } } }return false; } int main(){ n=read(); for(int i=1;i<=n;i++){ int x=read(),y=read(); add(x,i) , add(y,i); } for(int i=1;i<=M;i++){ if(!find(i)){printf("%d",i-1);return 0;} } }