题目链接:
http://codeforces.com/contest/1139/problem/E
题意:
数据范围:
分析:
ac代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=5e3+10;; 4 int match[maxn],vis[maxn],ans[maxn],p[maxn],c[maxn],k[maxn],d,n,m; 5 int ma[maxn][maxn],book[maxn],f[maxn],to[maxn],cnt,nex[maxn]; 6 void add(int a,int b) 7 { 8 cnt++; 9 to[cnt]=b; 10 nex[cnt]=f[a]; 11 f[a]=cnt; 12 } 13 bool dfs(int x) 14 { 15 if(vis[x])return false; 16 vis[x]=1; 17 for(int i=f[x]; i; i=nex[i]) 18 { 19 int v=to[i]; 20 if(match[v]==-1||dfs(match[v])) 21 { 22 match[v]=x; 23 return true; 24 } 25 } 26 return false; 27 } 28 int main() 29 { 30 scanf("%d %d",&n,&m); 31 for(int i=0; i<maxn; i++)match[i]=-1; 32 for(int i=1; i<=n; i++) 33 scanf("%d",&p[i]); 34 for(int i=1; i<=n; i++) 35 scanf("%d",&c[i]); 36 scanf("%d",&d); 37 for(int i=1; i<=d; i++) 38 { 39 scanf("%d",&k[i]); 40 book[k[i]]=1; 41 } 42 for(int i=1; i<=n; i++) 43 if(book[i]==0)add(p[i],c[i]); 44 45 for(int i=d; i>=1; i--) 46 { 47 ans[i]=ans[i+1]; 48 while(1) 49 { 50 memset(vis,0,sizeof(vis)); 51 if(dfs(ans[i]))ans[i]++; 52 else break; 53 } 54 int x=k[i]; 55 add(p[x],c[x]); 56 } 57 for(int i=1; i<=d; i++) 58 printf("%d\n",ans[i]); 59 return 0; 60 }