1. 程式人生 > >【題解】 [ZJOI2007]矩陣遊戲 (二分圖匹配)

【題解】 [ZJOI2007]矩陣遊戲 (二分圖匹配)

void 輸出 oid img bre pro href zjoi2007 sca

原題目戳我

Solution:

方法很巧妙,我們把每個裝備的屬性 與 裝備編號連起來

從1-10000跑二分圖,如果出現斷層,就退出,輸出答案就好。

memset清理bool快一點,int洛谷上超時了

板子題

Code:

技術分享圖片
 1 //It is coded by Ning_Mew on 3.14
 2 #include<bits/stdc++.h>
 3 
 4 using namespace std;
 5 
 6 const int maxn=1e6+7;
 7 
 8 int n,ans=0,be[maxn];
 9 bool vis[maxn];
10 int head[maxn],cnt=0
; 11 struct Edge{ 12 int nxt,to; 13 }edge[maxn*2]; 14 15 void add(int from,int to){ 16 edge[++cnt].nxt=head[from]; 17 edge[cnt].to=to; 18 head[from]=cnt; 19 } 20 bool find(int k){ 21 for(int i=head[k];i!=0;i=edge[i].nxt){ 22 int v=edge[i].to; 23 if(vis[v]==false){
24 vis[v]=true; 25 if(be[v]==-1||find(be[v])){be[v]=k;return true;} 26 } 27 } 28 return false; 29 } 30 31 int main(){ 32 scanf("%d",&n); 33 for(int i=1;i<=n;i++){ 34 int a,b;scanf("%d%d",&a,&b); 35 add(a,i);add(b,i); 36 }
37 memset(be,-1,sizeof(be)); 38 memset(vis,-1,sizeof(vis)); 39 for(int i=1;i<=10000;i++){ 40 memset(vis,false,sizeof(vis)); 41 if(find(i))ans++; 42 else break; 43 } 44 printf("%d\n",ans); 45 return 0; 46 }
View Code

【題解】 [ZJOI2007]矩陣遊戲 (二分圖匹配)