码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 1854 SCOI2010 游戏 二分图最大匹配/并查集

时间:2014-11-27 14:33:11      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:bzoj   bzoj1854   二分图最大匹配   匈牙利算法   并查集   

题目大意:给定n个武器,每个武器有两个属性,只能使用其中一个,要求选择一些武器 可以造成形如1 2 3 4的伤害 求最大伤害

题目大意我没写明白还是去看原题把QAQ

做法1:

同 1191 每个武器向两个属性连边 然后从1~10000枚举属性 跑二分图最大匹配 无法匹配则输出答案

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 1001001
using namespace std;
struct abcd{
    int to,next;
}table[M<<1];
int head[M],tot;
int n,m;
int result[M],state[M],T;
void Add(int x,int y)
{
    table[++tot].to=y;
    table[tot].next=head[x];
    head[x]=tot;
}
bool Hungary(int x)
{
    int i;
    for(i=head[x];i;i=table[i].next)
    {
        if(state[table[i].to]==T)
            continue;
        state[table[i].to]=T;
        if( !result[table[i].to] || Hungary(result[table[i].to]) )
        {
            result[table[i].to]=x;
            return true;
        }
    }
    return false;
}
int main()
{
    int i,x,y;
    cin>>m;
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        Add(x,i);Add(y,i);   
    }
    for(i=1;i<=10000;i++)
    {
        ++T;
        if( !Hungary(i) )
            break;
    }
    cout<<i-1<<endl;
}

做法2:

引用一下HZWER的题解:

将每个武器变成一条边 连接两个属性

如果一个联通块形成了一棵n个点的树 那么只能满足其中的n-1个的点

如果一个联通块有一个环 那么就能满足所有的点

于是我们用并查集维护图的连通性,对于每个集合记录这个联通块有没有环,以及这个联通块中最大的点是多少

一旦某个点所在并查集中无环且最大的点是自己那么就可以输出答案了

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 10100
using namespace std;
int n=10000,m;
int fa[M],v[M],max_num[M];
int Find(int x)
{
    if(!fa[x])
        fa[x]=x,max_num[x]=x;
    if(fa[x]==x)
        return x;
    return fa[x]=Find(fa[x]);
}
int main()
{
    int i,x,y;
    cin>>m;
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        x=Find(x);y=Find(y);
        if(x==y) 
            v[x]=1;
        else
        {
            fa[x]=y;
            v[y]|=v[x];
            max_num[y]=max(max_num[x],max_num[y]);
        }
    }
    for(i=1;i<=n;i++)
    {
        int temp=Find(i);
        if(v[temp]) continue;
        if(max_num[temp]==i) break;
    }
    cout<<i-1<<endl;
}


BZOJ 1854 SCOI2010 游戏 二分图最大匹配/并查集

标签:bzoj   bzoj1854   二分图最大匹配   匈牙利算法   并查集   

原文地址:http://blog.csdn.net/popoqqq/article/details/41544997

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!