【BZOJ1854】【codevs3358】游戏,二分图最大匹配

来源:互联网 发布:浅野菌子淘宝 编辑:程序博客网 时间:2024/06/05 00:40

传送门1
传送门2
写在前面:
昨天的题解终于写完了
思路:
一开始写的dinic,i=1-10000一个个枚举判断的,但因为每次都跑dinic导致T成狗,只过了50分,后来不得已现学了匈牙利,才过的……
左边1-10000,右边装备,对应的相连,枚举i=1-10000,看看i能不能得到匹配就可以了,不能就中断,答案就是i-1
原理就是每次得到的都是更大的匹配,不会使之前的匹配减少
注意:小心爆M
代码:

#include<bits/stdc++.h>#define inf 0x7fffffusing namespace std;int n,tot=1;int first[1020000],belong[1020000],vis[1020000];struct edge{    int v,next;}e[2000200];queue<int>q;void add(int x,int y){e[++tot]=(edge){y,first[x]};first[x]=tot;}int in(){    int t=0;char ch=getchar();    while (!isdigit(ch)) ch=getchar();    while (isdigit(ch)) t=(t<<3)+(t<<1)+ch-48,ch=getchar();    return t;}bool dfs(int x){    for (int i=first[x];i;i=e[i].next)        if (vis[e[i].v]!=x)        {            vis[e[i].v]=x;            if (!belong[e[i].v]||dfs(belong[e[i].v]))            {                belong[e[i].v]=x;                return 1;            }        }    return 0;}main(){    n=in();    for (int i=1;i<=n;i++)        add(in(),i+10000),        add(in(),i+10000);    for (int i=1;i<=10000;i++)        if (!dfs(i)) {printf("%d",i-1);return 0;}    printf("10000");}
0 0
原创粉丝点击