M_sea

洛谷1640 [SCOI2010]连续攻击游戏
Luogu算法题目中是一一匹配的关系,那么考虑二分图匹配。对于每一个物品,从它的属性向编号连边即可。统计答案时,从...
扫描右侧二维码阅读全文
20
2018/08

洛谷1640 [SCOI2010]连续攻击游戏

Luogu

算法

题目中是一一匹配的关系,那么考虑二分图匹配。

对于每一个物品,从它的属性向编号连边即可。

统计答案时,从1到10000枚举,如果不能匹配就break即可。

代码

#include <bits/stdc++.h>
#define re register
using namespace std;

inline int read() {
    int X=0,w=1; char c=getchar();
    while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
    while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
    return X*w;
}

struct Edge { int v,nxt; };
Edge e[2000010];
int head[1000010],cnt=0;

inline void addEdge(int u,int v) {
    e[++cnt].v=v;
    e[cnt].nxt=head[u];
    head[u]=cnt;
}

int link[1000010];
bool vis[1000010];

inline bool Hungary(int u) {
    for (re int i=head[u];i;i=e[i].nxt) {
        int v=e[i].v;
        if (!vis[v]) {
            vis[v]=1;
            if (!link[v]||Hungary(link[v])) {
                link[v]=u;
                return 1;
            }
        }
    }
    return 0;
}

int main() {
    int n=read();
    for (re int i=1;i<=n;i++) {
        int x=read(),y=read();
        addEdge(x,i);
        addEdge(y,i);
    }
    int ans=0;
    for (re int i=1;i<=10000;i++) {
        memset(vis,0,sizeof(vis));
        if (Hungary(i)) ans++;
        else break;
    }
    printf("%d\n",ans);
    return 0;
}
最后修改:2019 年 05 月 26 日 02 : 51 PM

发表评论