二分图匹配嘛
1e10的复杂度
想想剪枝:
1.首先如果这个属性值的武器没有,直接break
2.不能没遍历一遍就memset,因为used只记录当前右边有无遍历过,那么我们可以用ans来优化一下
没有2优化在da....oj上跑了3877ms,我以为能过了,到bzoj上一交就T了qwq
/**************************************************************
Problem: 1854
User: syh0313
Language: C++
Result: Accepted
Time:820 ms
Memory:33840 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
using
namespace
std;
const
int
maxe=2020010;
const
int
maxd=1010010;
int
n,topt,st[maxe],nt[maxe],to[maxe],lk[maxd],ans=1,ud[maxd];
bool
f[maxd];
inline
void
add(
int
x,
int
y)
{to[++topt]=y; nt[topt]=st[x]; st[x]=topt;}
inline
bool
dfs(
int
x)
{
if
(x==-1)
return
1;
int
p=st[x];
while
(p)
{
if
(ud[to[p]]!=ans)
{
ud[to[p]]=ans;
if
(lk[to[p]]==-1 || dfs(lk[to[p]])) {lk[to[p]]=x;
return
1;}
}
p=nt[p];
}
return
0;
}
inline
int
read()
{
int
xx=0,ff=1;
char
c=
getchar
();
while
(c<
'0'
|| c>
'9'
) {
if
(c==
'-'
) ff=-1; c=
getchar
();}
while
(c>=
'0'
&& c<=
'9'
) {xx=(xx<<1)+(xx<<3)+c-
'0'
; c=
getchar
();}
return
xx*ff;
}
int
main()
{
register
int
i;
n=read();
memset
(lk,-1,
sizeof
lk);
for
(i=1;i<=n;i++)
{
int
xx,yy; xx=read(); yy=read();
add(xx,10001+i); add(yy,10001+i); f[xx]=1; f[yy]=1;
}
for
(i=1;i<=10000;i++)
if
(f[i]) {
if
(dfs(i)) ans++;
else
break
;}
else
break
;
printf
(
"%d\n"
,ans-1);
return
0;
}