zoukankan      html  css  js  c++  java
  • hdoj1914(稳定婚姻问题)

    /***************************************************************\
    * Author: Hu Wenbiao
    * Created Time: Sun 12 Sep 2010 08:36:41 M CST
    * File Name: main.cpp
    * Description: 延迟认可算法。
    \***************************************************************/
    //*========================*Head File*========================*\\
    
    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<queue>
    /*----------------------*Global Variable*----------------------*/
    struct PERSON {
        int cur;			//对男士来说是即将表白的对象在它的列表中的位置,对女
    						//士来说是她现在的对象。
        int rank[27];		//列表
    } M[27], F[27];
    int T, n, m, f, LOVE[27][27];	//F[i][j]女士i对男士j的好感度,0最高,25最低
    char ch;
    bool exist_m[27], exist_f[27];
    //*=======================*Main Program*=======================*//
    using namespace std;
    
    int solve(int m)
    {				//m向M[m].rank[M[m].cur]表白,返回失恋者
        f = M[m].rank[M[m].cur];
        int cur = F[f].cur;
        if (LOVE[f][m] < LOVE[f][cur]) {
    	F[f].cur = m;
    	return cur;
        } else
    	return m;
    }
    
    int main()
    {
    //freopen("input","r",stdin);
        scanf("%d", &T);
        queue < int >q;
    
        while (T--) {
    	scanf("%d", &n);
    	memset(M, 0, sizeof(M));
    	memset(F, 0, sizeof(F));
    	memset(exist_m, 0, sizeof(exist_m));
    	memset(exist_f, 0, sizeof(exist_f));
    	for (int i = 0; i < n; i++) {
    	    while (scanf("%c", &ch), ch < 'a' || ch > 'z');
    	    ch -= 'a';
    	    exist_m[ch] = true;
    	    q.push((int) ch);	//男士加入单身队列
    	}
    	for (int i = 0; i < n; i++) {
    	    while (scanf("%c", &ch), ch < 'A' || ch > 'Z');
    	    ch -= 'A';
    	    exist_f[ch] = true;
    	}
    	for (int i = 0; i < n; i++) {
    	    while (scanf("%c", &ch), ch < 'a' || ch > 'z');
    	    m = ch - 'a';
    	    for (int j = 0; j < n; j++) {
    		while (scanf("%c", &ch), ch < 'A' || ch > 'Z');
    		M[m].rank[j] = ch - 'A';
    	    }
    	}
    	for (int i = 0; i < n; i++) {
    	    while (scanf("%c", &ch), ch < 'A' || ch > 'Z');
    	    f = ch - 'A';
    	    for (int j = 0; j < n; j++) {
    		while (scanf("%c", &ch), ch < 'a' || ch > 'z');
    		LOVE[f][ch - 'a'] = j;
    	    }
    	}
    	for (int i = 0; i < 27; i++)
    	    F[i].cur = 26;	//女士对象全部初始化为26
    	for (int i = 0; i < 27; i++)
    	    LOVE[i][26] = 26;	//女士对26的好感度最低
    	while (!q.empty()) {
    	    m = q.front();
    	    q.pop();
    
    	    int fail = solve(m);
    	    if (fail == 26)
    		continue;
    	    M[fail].cur++;
    	    q.push(fail);
    	}
    	for (int i = 0; i < 26; i++) {
    	    if (exist_m[i])
    		for (int j = 0; j < 27; j++)
    		    if (F[j].cur == i) {
    			printf("%c %c\n", 'a' + i, 'A' + j);
    			break;
    		    }
    	}
    	if (T)
    	    printf("\n");
        }
    }
    

  • 相关阅读:
    BZOJ 3522 Hotel
    BZOJ 1864 三色二叉树
    396595
    CodeForces
    CodeForces
    CodeForces
    E. 数字串
    算术基本定理总结
    Cyclic Nacklace 杭电3746
    Period
  • 原文地址:https://www.cnblogs.com/Open_Source/p/1904873.html
Copyright © 2011-2022 走看看