luogu 1640 連續攻擊遊戲
阿新 • • 發佈:2018-09-04
har sizeof main 二分圖匹配 include 二分 getch div insert
二分圖匹配,將需要進行的編號(1-10000)和物件進行匹配,而非編號之間,編號對應物品
#include<bits/stdc++.h> using namespace std; const int N=10005; const int M=1000005; inline int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;} int n,tot,ans,vis[N],head[N],link[M]; struct node{int v,next;}e[M<<1]; void insert(int u,int v){ e[++tot]=(node){v,head[u]};head[u]=tot;} int match(int u){ if(vis[u]) return 0; vis[u]=1; for(int i=head[u];i;i=e[i].next){ int v=e[i].v; if(!link[v]||match(link[v])){ link[v]=u;return 1;} }return 0; } /* int match(int u){ if(vis[u]) return 0; vis[u]=1; for(int i=head[u];i;i=e[i].next){ int v=e[i].v; if(vis[v]) continue; vis[v]=1; if(!link[v]||match(link[v])){ link[v]=u;return 1;} }return 0; } 上述寫法會漏掉在match(link[v])中對link[v]的vis判斷*/ //將編號和屬性相連接進行二分圖匹配 //尋找每個屬性由1-10000(x,y) 匹配到的物件編號(i) int main(){ n=read(); for(int x,y,i=1;i<=n;i++){ x=read(),y=read(); insert(x,i),insert(y,i);} for(int i=1;i<=10000;i++){ memset(vis,0,sizeof vis); if(match(i)) ans++; else break;} printf("%d",ans);return 0; }
luogu 1640 連續攻擊遊戲