[SCOI2010]游戏

[SCOI2010]游戏

https://ac.nowcoder.com/acm/problem/20566

题意:
你有n件装备,每件装备有两个属性,每件装备只能用一次,你打boss时属性只能从1开始连续用装备攻击,求你的最大攻击次数。

思路:
二分图匹配问题,属性与物品编号连边,从1开始匹配,用匈牙利算法,冲突时进行改变。

代码:

#include <bits/stdc++.h>
typedef long long ll;

using namespace std;

const ll inf=998244353;

inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

int ma[1000005], t[1000005][2], mb[1000005];
vector<int> g[1000005];

int dfs(int k)
{
    for(int i=0; i<g[k].size(); i++)
    {
        if(!ma[g[k][i]])
        {
            ma[g[k][i]]=1;
            return 1;
        }
    }
    for(int i=0; i<g[k].size(); i++)
    {
        if(!mb[g[k][i]])
        {
            mb[g[k][i]]=1;
            if(t[g[k][i]][0]==k&&dfs(t[g[k][i]][1]))
            {
                ma[g[k][i]]=1;
                return 1;
            }
            else if(t[g[k][i]][1]==k&&dfs(t[g[k][i]][0]))
            {
                ma[g[k][i]]=1;
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        int u, v;
        scanf("%d%d",&u,&v);
        g[u].push_back(i);
        g[v].push_back(i);
        t[i][0]=u;
        t[i][1]=v;
    }
    int i=1;
    for(; i<=n+1; i++)
    {
        if(dfs(i))
        {
            ;
        }
        else
        {
            break;
        }
    }
    cout << i-1 << endl;
    return 0;
}
全部评论

相关推荐

评论
1
收藏
分享
牛客网
牛客企业服务