洛谷 P1640 [SCOI2010]连续攻击游戏(二分图匹配)
传送门
解题思路
从所有攻击力向武器连边,形成二分图,然后枚举攻击力1...10000,如果匹配成功,就继续,否则输出程序结束。
注意:
对于枚举每一个攻击力如果用memset清空vis数组会超时(TLE四个点),所以我们在标记后退出前单个清空(见代码)。
AC代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxn=1000005; 6 int cnt,n,p[10005],vis[maxn],ok[maxn]; 7 struct edge{ 8 int v,next; 9 }e[maxn*2]; 10 void insert(int u,int v){ 11 cnt++; 12 e[cnt].v=v; 13 e[cnt].next=p[u]; 14 p[u]=cnt; 15 } 16 bool work(int u){ 17 for(int i=p[u];i!=-1;i=e[i].next){ 18 int v=e[i].v; 19 if(vis[v]) continue; 20 vis[v]=1; 21 if(!ok[v]||work(ok[v])){ 22 ok[v]=u; 23 vis[v]=0; 24 return true; 25 } 26 vis[v]=0; 27 } 28 return false; 29 } 30 int main() 31 { 32 memset(p,-1,sizeof(p)); 33 cin>>n; 34 for(int i=1;i<=n;i++){ 35 int u1,u2; 36 scanf("%d%d",&u1,&u2); 37 insert(u1,i); 38 insert(u2,i); 39 } 40 for(int i=1;i<=10001;i++){ 41 if(!work(i)){ 42 cout<<i-1; 43 return 0; 44 } 45 } 46 return 0; 47 }
//SCOI2010 Day1t2