zoukankan      html  css  js  c++  java
  • hdu 1914 The Stable Marriage Problem(稳定婚配系统)

    关于稳定婚配,下面的博客写得很错,思路很好理解

    http://www.cppblog.com/goal00001111/archive/2010/04/14/112525.html

    模板

    View Code
    #include <iostream>
    using namespace std;
    const int MAX = 4;
    int main()
    {
    int libMan[MAX][MAX] = {{2, 1, 3, 0}, {0, 2, 3, 1}, {2, 3, 1, 0}, {1, 3, 2, 0}}; //存储男士所喜欢的女士序号的排列表
    int libLady[MAX][MAX+1] = {{0, 3, 1, 2, MAX}, {1, 3, 2, 3, MAX}, {0, 2, 3, 1, MAX}, {1, 0, 3, 2, MAX}}; //存储女士所喜欢的男士序号的排列表
    int libladyValue[MAX][MAX+1] = {0};
    for (int i = 0; i < MAX; i++) //把女士喜好的男士序号的排列表转换为男士分值表
    {
    for (int j = MAX, k = 0; j >= 0; j--, k++)
    {
    libladyValue[i][libLady[i][j]] = k;
    }
    }
    int man[MAX+1] = {0};//存储各个男士追求女士的次数
    int lady[MAX] = {MAX, MAX, MAX, MAX}; //序号初始值MAX表示一个“不存在”的男士,即其分值比任何男士都低
    int S[MAX] = {0};//一个栈,用来存储所有自由男的序号
    int top = 0;
    while (top < MAX) //把所有自由男的序号存储到栈中
    S[top] = top++;
    top--; //top指向栈顶
    while (top >= 0)//让自由男主动去追求自己喜欢的女士,直到所有的人都配对
    {
    int v = libMan[S[top]][man[S[top]]]; //处在栈顶(序号为S[top])的男士喜欢v号女
    if (libladyValue[v][lady[v]] < libladyValue[v][S[top]]) //若栈顶男比v号女当前男友优秀,则 v抛弃前男友,接受栈顶男
    {
    int t = lady[v]; //存储前男友序号
    man[t]++; //抛弃前男友,即前男友选择其“次喜欢女”
    lady[v] = S[top--]; //选择栈顶男为新男友,同时栈顶男出栈
    if (t != MAX) //如果t号男不是那个“不存在”的男士
    S[++top] = t; //t号男作为新的栈顶男
    }
    else //栈顶男追求下一号目标
    man[S[top]]++;
    }
    for (int i = 0; i < MAX; i++) //输出每位男士追求女士的次数
    cout << man[i] + 1 << ", ";
    cout << endl;
    for (int i = 0; i < MAX; i++) //输出每位男士的妻子的序号
    cout << libMan[i][man[i]] << ", ";
    cout << endl;
    for (int i = 0; i < MAX; i++) //输出每位女士的丈夫的序号
    cout << lady[i] << ", ";
    cout << endl;
    return 0;
    }

    稳定婚配的模板题

    下面的倆道题目都是赤裸裸的模板题

    hdu1914 The Stable Marriage Problem

    View Code
    #include<iostream>
    using namespace std;
    const int MAX = 27;
    int libMan[MAX][MAX],libLady[MAX][MAX+1],libladyValue[MAX][MAX+1];
    int man[MAX+1],lady[MAX];
    int hashm[MAX],hashf[MAX];
    bool ism[MAX],isf[MAX];
    void solve(int n)
    {
    int s[MAX]={0},top;
    memset(man,0,sizeof(man));
    for(int i=0;i<n;i++)
    {
    lady[i]=n;
    s[i]=i;
    }
    top=n-1;
    while(top>=0)
    {
    int v=libMan[s[top]][man[s[top]]];
    if(libladyValue[v][lady[v]]<libladyValue[v][s[top]])
    {
    int t=lady[v];
    man[t]++;
    lady[v]=s[top--];
    if(t!=n)
    s[++top]=t;
    }
    else man[s[top]]++;
    }
    }
    int main()
    {
    int T,cas=0,n;
    char name[MAX];
    scanf("%d",&T);
    while(T--)
    {
    memset(ism,false,sizeof(ism));
    memset(isf,false,sizeof(isf));
    if(cas)
    puts("");
    cas++;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
    scanf("%s",name);
    ism[name[0]-'a']=true;
    }
    for(int i=0;i<n;i++)
    {
    scanf("%s",name);
    isf[name[0]-'A']=true;
    }
    int m=0,f=0;
    for(int i=0;i<MAX;i++)
    {
    if(ism[i])
    hashm[i]=m++;
    if(isf[i])
    hashf[i]=f++;
    }
    for(int i=0;i<n;i++)
    {
    scanf("%s",name);
    int mm=hashm[name[0]-'a'];
    for(int j=2;j<n+2;j++)
    libMan[mm][j-2]=hashf[name[j]-'A'];
    }
    for(int i=0;i<n;i++)
    {
    scanf("%s",name);
    int ff=hashf[name[0]-'A'];
    for(int j=2;j<n+2;j++)
    libLady[ff][j-2]=hashm[name[j]-'a'];
    libLady[ff][n]=n;
    }
    for(int i=0;i<n;i++)
    for(int j=n,k=0;j>=0;j--,k++)
    libladyValue[i][libLady[i][j]]=k;
    solve(n);
    for(int i=0;i<MAX;i++)
    {
    if(ism[i])
    printf("%c %c\n",i+'a',libMan[hashm[i]][man[hashm[i]]]+'A');
    }
    }
    return 0;
    }

    hdu1435 Stable Match

    View Code
    #include<iostream>
    #include<algorithm>
    #include<math.h>
    const int MAX = 210;
    using namespace std;
    struct node
    {
    double x,y,z,w;
    int id;
    };
    struct dist
    {
    double d,w;
    int id;
    dist(){}
    dist(int id,double d,double w):id(id),d(d),w(w){}
    };
    node send[MAX],rec[MAX];
    dist dis[MAX];
    double gg[MAX][MAX];
    int n,ss[MAX][MAX],rr[MAX][MAX],s[MAX],r[MAX];
    int rv[MAX][MAX];
    double get_dis(node a,node b)
    {
    gg[a.id][b.id]=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z);
    return gg[a.id][b.id];
    }
    bool cmp(dist a,dist b)
    {
    if(a.d!=b.d)
    return a.d<b.d;
    return a.w>b.w;
    }
    void init()
    {
    for(int i=1;i<=n;i++)
    {
    for(int j=1;j<=n;j++)
    dis[j]=dist(rec[j].id,get_dis(send[i],rec[j]),rec[j].w);
    sort(dis+1,dis+n+1,cmp);
    for(int j=1;j<=n;j++)
    ss[send[i].id][j]=dis[j].id;
    }
    for(int i=1;i<=n;i++)
    {
    for(int j=1;j<=n;j++)
    dis[j]=dist(send[j].id,get_dis(rec[i],send[j]),send[j].w);
    sort(dis+1,dis+n+1,cmp);
    for(int j=1,k=n;j<=n;j++,k--)
    {
    rr[rec[i].id][j]=dis[j].id;
    rv[rec[i].id][dis[j].id]=k;
    }
    rv[rec[i].id][n+1]=0;
    }
    for(int i=1;i<=n;i++)
    {
    r[i]=n+1;
    s[i]=1;
    }
    }
    void solve()
    {
    int st[MAX];
    for(int i=1;i<=n;i++)
    {
    st[i-1]=send[i].id;
    }
    int top=n-1;
    while(top>=0)
    {
    int v=ss[st[top]][s[st[top]]];
    if(rv[v][r[v]]<rv[v][st[top]])
    {
    int t=r[v];
    s[t]++;
    r[v]=st[top--];
    if(t!=n+1)
    st[++top]=t;
    }
    else s[st[top]]++;
    }
    }
    int main()
    {
    int T;
    scanf("%d",&T);
    while(T--)
    {
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d %lf %lf %lf %lf",&send[i].id,&send[i].w,&send[i].x,&send[i].y,&send[i].z);
    for(int i=1;i<=n;i++)
    scanf("%d %lf %lf %lf %lf",&rec[i].id,&rec[i].w,&rec[i].x,&rec[i].y,&rec[i].z);
    init();
    solve();
    for(int i=1;i<=n;i++)
    printf("%d %d\n",r[i],i);
    printf("\n");
    }
    return 0;
    }


    hdu1522 Marriage is Stable

    View Code
    #include<iostream>
    #include<string>
    #include<string.h>
    #include<algorithm>
    #include<map>
    using namespace std;
    
    const int N = 500+10;
    
    int libMan[N][N],libLady[N][N],libladyValue[N][N];
    int man[N],lady[N],n;
    map<string,int> men,women;
    char name1[N][50],name2[N][50],str[50];
    
    void solve()
    {
        int s[N]={0},top=0;
        memset(man,0,sizeof(man));
        for(int i=0;i<n;++i)
        {
            lady[i]=n;
            s[i]=i;
        }
        top=n-1;
        while(top>=0)
        {
            int v=libMan[s[top]][man[s[top]]];
            if(libladyValue[v][lady[v]]<libladyValue[v][s[top]])
            {
                int t=lady[v];
                man[t]++;
                lady[v]=s[top--];
                if(t!=n)
                    s[++top]=t;
            }
            else man[s[top]]++;
        }
    }
    int main()
    {
        while(scanf("%d",&n)==1)
        {
            scanf("%s",name1[0]);
            men.clear();
            women.clear();
            men[string(name1[0])]=0;
            for(int j=0;j<n;++j)
            {
                scanf("%s",name2[j]);
                women[string(name2[j])]=j;
                libMan[0][j]=j;
            }
            for(int i=1;i<n;++i)
            {
                scanf("%s",name1[i]);
                men[string(name1[i])]=i;
                for(int j=0;j<n;++j)
                {
                    scanf("%s",str);
                    libMan[i][j]=women[string(str)];
                }
            }
            for(int i=0;i<n;++i)
            {
                scanf("%s",str);
                int id=women[string(str)];
                for(int j=0;j<n;++j)
                {
                    scanf("%s",str);
                    libLady[id][j]=men[string(str)];
                }
                libLady[id][n]=n;
            }
            for(int i=0;i<n;++i)
                for(int j=n,k=0;j>=0;j--,++k)
                    libladyValue[i][libLady[i][j]]=k;
            solve();
            for(int i=0;i<n;++i)
                printf("%s %s\n",name1[i],name2[libMan[i][man[i]]]);
            puts("");
        }
        return 0;
    }
  • 相关阅读:
    scrapy爬虫系列之三--爬取图片保存到本地
    scrapy爬虫系列之四--爬取列表和详情
    python3.7.2 ssl版本过低导致pip无法使用的问题
    python3安装后无法使用退格键的问题
    位运算符和unity Layers
    unity常用小知识点
    unity -- Time类(持续更新中)
    随便说说 post-processing
    unity图片后期处理
    顶点/片元 shader 总结
  • 原文地址:https://www.cnblogs.com/nanke/p/2396178.html
Copyright © 2011-2022 走看看