洛谷 P1640 [SCOI2010]连续攻击游戏(二分图匹配)

传送门


解题思路

从所有攻击力向武器连边,形成二分图,然后枚举攻击力1...10000,如果匹配成功,就继续,否则输出程序结束。

注意:

对于枚举每一个攻击力如果用memset清空vis数组会超时(TLE四个点),所以我们在标记后退出前单个清空(见代码)。

AC代码

 1 #include
 2 #include
 3 #include
 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<1;
43             return 0;
44         }
45     }
46     return 0;
47 }

//SCOI2010 Day1t2

你可能感兴趣的:(洛谷 P1640 [SCOI2010]连续攻击游戏(二分图匹配))