首页 > 其他 > 详细

[P1640][SCOI2010]连续攻击游戏

时间:2018-07-21 23:29:18      阅读:121      评论:0      收藏:0      [点我收藏+]

Link:

P1640 传送门

Solution:

可以发现这道题其实是属性值集合和装备集合的对应,且每个点只能用一次

那么就能想到二分图最大匹配,一旦不可行直接退出就行了

 

Tip:

1、$Hungry$算法连有向边就行了……

2、注意左右两个集合范围不同!

Code:

#include <bits/stdc++.h>

using namespace std;
const int MAXN=1e4+5;//边数和Y集合点数都为1e6级别 
struct edge{int nxt,to;}e[2000005];
int n,x,y,match[1000005],vis[MAXN],head[MAXN],tot;

void add(int from,int to)
{e[++tot].nxt=head[from];e[tot].to=to;head[from]=tot;}

int dfs(int u)
{
    vis[u]=true;
    for(int i=head[u];i;i=e[i].nxt)
    {
        int m=match[e[i].to];
        if(m==-1||!vis[m]&&dfs(m))
        {match[e[i].to]=u;return 1;}
    }
    return 0;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)//Hungry直接连单向边就行了 
        scanf("%d%d",&x,&y),add(x,i),add(y,i);
        
    int res=0;memset(match,-1,sizeof(match));
    for(int i=1;i<=10000;i++)
    {
        memset(vis,0,sizeof(vis));
        if(dfs(i)) res++;
        else break;
    }
    printf("%d",res);
    return 0;
}

 

[P1640][SCOI2010]连续攻击游戏

原文:https://www.cnblogs.com/newera/p/9348195.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!