hdu5090Game with Pearls(二分图匹配)

来源:互联网 发布:恶搞锁屏软件 编辑:程序博客网 时间:2024/06/06 19:03

这道题目其实应该是可以用模拟写的,但是后来发现可以用二分图来解决,就写了一发,结果一直wa了一晚上,后来发现比如说1,2,3,4,5,5,我是按值进行加边的,结果5只加了一轮边,所以匹配数无论怎么算最多也只可能是5,(本来是打算哈希一下之类的,后来发现了更好的办法),这个时候我们就不能按照权值来加边了,要用点加边,这样就能保证每个点至少加了一次

#include <iostream>#include <string.h>#include <algorithm>using namespace std;const int maxn=105;int un,vn;int g[maxn][maxn];int a[maxn];int linker[maxn*maxn];bool used[maxn*maxn];bool dfs(int u){    for(int v=1; v<=vn; v++)        if(g[u][v]&&!used[v])        {            used[v]=true;            if(linker[v]==-1||dfs(linker[v]))            {                linker[v]=u;                return true;            }        }    return false;}int hungry(){    int res=0;    memset(linker,-1,sizeof(linker));    for(int u=1; u<=un; u++)    {        memset(used,false,sizeof(used));        if(dfs(u))            res++;    }    return res;}int cmp(int x,int y){    return x<y;}int main(){    int T,n,k;    cin>>T;    while(T--)    {        memset(g,0,sizeof(g));        memset(a,0,sizeof(a));        cin>>n>>k;        for(int i=1; i<=n; i++)            cin>>a[i];       sort(a+1,a+n+1,cmp);        for(int i=1;i<=n;i++)        for(int j=0; j<=n,a[i]+j<=n; j+=k)        {         //g[a[i]][a[i]+j]=1;这样写是不行的,因为只把值加边,当同一个值出现了多次的时候,就会出现问题了,切记           g[i][a[i]+j]=1;        }        vn=n,un=n;        int ans=hungry();        if(ans==n)            cout<<"Jerry"<<endl;        else cout<<"Tom"<<endl;    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 三个月婴儿感冒发烧怎么办 小孩感冒发烧流鼻涕怎么办 小孩感冒发烧反反复复怎么办 宝宝反复发烧39怎么办 一岁婴儿流鼻涕怎么办 四岁宝宝发烧怎么办 小孩流清鼻涕怎么办? 5宝宝光流清鼻涕怎么办 孩子一直流鼻子怎么办 10岁天天流鼻涕怎么办 喉咙痛又痒咳嗽怎么办 60天宝宝流鼻涕怎么办 宝宝流鼻子严重怎么办 鼻炎鼻涕多鼻塞怎么办 夏天老人感冒流鼻涕怎么办 鼻窦炎流清鼻涕怎么办 鼻子有脓鼻涕怎么办 宝宝有脓鼻涕怎么办 小孩脓鼻涕咳嗽怎么办 哺乳期流黄鼻涕怎么办 宝宝鼻塞流脓涕怎么办 喉咙痛浓痰咳嗽怎么办 哺乳期留清鼻涕怎么办 哺乳期就清鼻涕怎么办 小金毛流脓鼻涕怎么办 鼻炎有浓鼻涕怎么办 宝宝流稠鼻涕怎么办 小孩流粘鼻涕怎么办 小孩流黄鼻涕怎么办 鼻炎有脓鼻涕怎么办 小孩鼻子有鼻涕怎么办 小儿浓鼻涕咳嗽怎么办 宝宝冻着流鼻涕怎么办 打喷嚏流清鼻涕怎么办 鼻子老想打喷嚏怎么办 冻着了流鼻涕怎么办 狗狗鼻塞流鼻涕怎么办 感冒总爱打喷嚏怎么办 一直流鼻涕怎么回事该怎么办 感冒一直流鼻涕该怎么办 婴儿一个月鼻塞怎么办