【数据范围】
对于30%的数据,保证N < =1000
对于100%的数据,保证N < =1000000
Day1
原题连接:http://www.lydsy.com/JudgeOnline/problem.php?id=1854
【分析】:此题为二分图匹配,同BZOJ 1191 [HNOI2006]超级英雄Hero一样,挑战BOSS是一轮接一轮的,不能中断,则若不能匹配就退出输出答案。用装备匹配回合。但需注意的是:由于N≤1000000,在建图时不能直接开2维,而应建邻接链表存。另外,每次匹配后的visit初始化不能用memset,否则会超时。c++的STL--bitset可起到相同作用。
【代码】:#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<iostream> #include<bitset> using namespace std; #define MAX 1000001 struct MAP1{int next,to;}; MAP1 a[2*MAX]; int M,q[2*MAX],tot=1,N; int P[MAX],ans=0,max1=0; bitset<MAX> visit; void add_point(int A,int B) { a[tot].to=B; a[tot].next=q[A]; q[A]=tot++; } bool work(int now) { for(int i=q[now];i;i=a[i].next) { if(!visit[a[i].to]) { visit[a[i].to]=1; if(!P[a[i].to] || work(P[a[i].to])) { P[a[i].to]=now; return true; } } } return false; } int main() { //freopen("game.in","r",stdin); //freopen("game.out","w",stdout); memset(a,0,sizeof(a)); memset(P,0,sizeof(P)); scanf("%d",&N); for(int i=1;i<=N;i++) { int A,B; scanf("%d%d",&A,&B); max1=max(A,max1); max1=max(B,max1); add_point(A,i); add_point(B,i); } for(int i=1;i<=max1;i++) { //memset(visit,false,sizeof(visit)); visit.reset(); if(work(i)) ans++; else break; } printf("%d\n",ans); //system("pause"); return 0; }转载注明出处: http://blog.csdn.net/u011400953