当前位置: 首页 > news >正文

UVALive 6322 最大匹配...

/*
 *e...大概明白了。首先用最大匹配看看是不是存在符合题意的匹配。然后呢。对枚举找到每个位置符合的字母里最小的那个。
 *判断是否能构成最大匹配。直到找完最后一个位置输出就好了。、

 *还是有些不理解最大匹配匈牙利算法的过程。而且这个题是最大匹配。也没想到。
 */

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 110

int g[N][N]; // 图的存储方式。矩阵。
int n; //二分图两个顶点集 本题个数相等
int vis[N]; //判断V2中的点是否已经被搜索过。一次寻找最大匹配中.
int viss[N]; // 判断V2中的点是不是已经被匹配到其它位置。所有的最大匹配过程都包括。
int link[N]; // 记录V2中的点和谁匹配了。
int m; // 最大匹配数;
int len; // 还未匹配的长度
char str[N], s[N];
int ans[N]; //保存每个位置匹配的字符对应的位置。

void init()
{
    memset(vis, 0, sizeof(vis));
    memset(viss, 0, sizeof(viss));
    memset(link, 0, sizeof(link));
    memset(g, 0, sizeof(g));
    memset(ans, 0, sizeof(ans));
    m  = 0;
}

void build()
{
    cin >> str+1;
    n = strlen(str+1);
    sort(str+1, str+1+n);
    for (int i=1; i<=n; ++i)
    {
        cin >> s;
        int len2 = strlen(s);
        for (int j=1; j<=n; ++j)
        {
            for (int k=0; k<len2; ++k)
            {
                if (str[j] == s[k])
                    g[i][j] = 1;  // 建图。我没想到这样建。
            }
        }
    }
}

int dfs(int x)
{
    for (int y=1; y<=n; ++y)
    {
        if (g[x][y] && !vis[y] && !viss[y])  // 如果x和y有边。而且y未被搜索和匹配.
        {
            vis[y] = 1;  // 标记已被搜索过.
            if (link[y] == 0 || dfs(link[y]))  //如果y未被匹配。或者y匹配的节点可以找到增广路。(为什么这也算是匹配成功呢。那和这个节点匹配的怎么办)
            {
                link[y] = x;    //当前匹配成功。
                return 1;
            }
        }
    }
    return 0;
}

void max_m()
{
    for (int x=1; x<=n; ++x)
    {
        memset(vis, 0, sizeof(vis)); // 清空上次搜索时的标记。
        if (dfs(x))
            m++;
    }
    return ;
}

int match()
{
    int anss = 0;
    memset(link, 0, sizeof(link));
    for (int x=1; x<=n; ++x)
    {
        if (ans[x]) continue;
        memset(vis, 0, sizeof(vis));
        if (dfs(x)) anss++;
    }
    return anss == len;
}

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        init();
        build();
        max_m();
        if (m  < n)
        {
            cout << "NO SOLUTION\n";
            continue;
        }
        len = n;
        for (int i=1; i<=n; ++i) // 遍历每个位置的最小字符 用最大匹配判断是否可行。
        {
            for (int j=1; j<=n; ++j)
            {
                if (!viss[j] && g[i][j]) // 没有被其它位置匹配。而且和当前位置有边。
                {
                    ans[i] = j;
                    len--;
                    viss[j] = 1;
                    if (match()) break; // 当前位置成功。继续匹配下一个位置。
                    viss[j] = 0; //如果不成功。回溯。
                    len++;
                }
            }
        }
        for (int x=1; x<=n; ++x)
        {
            cout << str[ans[x]];
        }
        cout << endl;
    }
    return 0;
}
LOoK

 

转载于:https://www.cnblogs.com/icode-girl/p/4698729.html

相关文章:

  • 模板方法模式
  • Android Studio 简单介绍和使用问题小结
  • Redis内存存储结构分析
  • 数组删除空缺时的多余逗号
  • 图片验证
  • JDBC加载过程
  • 让DIV中文字换行显示
  • hdu 4050 2011北京赛区网络赛K 概率dp ***
  • git stash用法
  • 545E. Paths and Trees
  • hdu 1166 敌兵布阵 ( 线段树或者树状数组)
  • WIN7 自动同步服务器上备份文件
  • swift UI特殊培训38 与滚动码ScrollView
  • Objective-C:在类中设置不同协议
  • React Native 简介:用 JavaScript 搭建 iOS 应用(2)
  • 《Java编程思想》读书笔记-对象导论
  • Bytom交易说明(账户管理模式)
  • Codepen 每日精选(2018-3-25)
  • echarts的各种常用效果展示
  • javascript 哈希表
  • leetcode98. Validate Binary Search Tree
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Nodejs和JavaWeb协助开发
  • Python连接Oracle
  • Python语法速览与机器学习开发环境搭建
  • Quartz初级教程
  • RxJS: 简单入门
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • webpack4 一点通
  • 前端自动化解决方案
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​secrets --- 生成管理密码的安全随机数​
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ###STL(标准模板库)
  • #QT(串口助手-界面)
  • (笔试题)分解质因式
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (转)项目管理杂谈-我所期望的新人
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • (状压dp)uva 10817 Headmaster's Headache
  • .NET 5种线程安全集合
  • .Net IOC框架入门之一 Unity
  • .NET 解决重复提交问题
  • .net 提取注释生成API文档 帮助文档
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net中wcf服务生成及调用
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [.net]官方水晶报表的使用以演示下载
  • [20180129]bash显示path环境变量.txt
  • [4.9福建四校联考]
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息