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, , sizeof(vis));
memset(viss, , sizeof(viss));
memset(link, , sizeof(link));
memset(g, , sizeof(g));
memset(ans, , sizeof(ans));
m = ;
} void build()
{
cin >> str+;
n = strlen(str+);
sort(str+, str++n);
for (int i=; i<=n; ++i)
{
cin >> s;
int len2 = strlen(s);
for (int j=; j<=n; ++j)
{
for (int k=; k<len2; ++k)
{
if (str[j] == s[k])
g[i][j] = ; // 建图。我没想到这样建。
}
}
}
} int dfs(int x)
{
for (int y=; y<=n; ++y)
{
if (g[x][y] && !vis[y] && !viss[y]) // 如果x和y有边。而且y未被搜索和匹配.
{
vis[y] = ; // 标记已被搜索过.
if (link[y] == || dfs(link[y])) //如果y未被匹配。或者y匹配的节点可以找到增广路。(为什么这也算是匹配成功呢。那和这个节点匹配的怎么办)
{
link[y] = x; //当前匹配成功。
return ;
}
}
}
return ;
} void max_m()
{
for (int x=; x<=n; ++x)
{
memset(vis, , sizeof(vis)); // 清空上次搜索时的标记。
if (dfs(x))
m++;
}
return ;
} int match()
{
int anss = ;
memset(link, , sizeof(link));
for (int x=; x<=n; ++x)
{
if (ans[x]) continue;
memset(vis, , 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=; i<=n; ++i) // 遍历每个位置的最小字符 用最大匹配判断是否可行。
{
for (int j=; j<=n; ++j)
{
if (!viss[j] && g[i][j]) // 没有被其它位置匹配。而且和当前位置有边。
{
ans[i] = j;
len--;
viss[j] = ;
if (match()) break; // 当前位置成功。继续匹配下一个位置。
viss[j] = ; //如果不成功。回溯。
len++;
}
}
}
for (int x=; x<=n; ++x)
{
cout << str[ans[x]];
}
cout << endl;
}
return ;
}
LOoK
UVALive 6322 最大匹配...的更多相关文章
- HDU 3279 二分图最大匹配
DES: 就是说对每个人都给你一个区间.但一个人只匹配一个数.问你满足匹配的人的序号字典序最大时的最大匹配是什么. 前几天刚做的UVALive 6322...当然是不一样的...那个要求的最大匹配的个 ...
- Taxi Cab Scheme UVALive - 3126 最小路径覆盖解法(必须是DAG,有向无环图) = 结点数-最大匹配
/** 题目:Taxi Cab Scheme UVALive - 3126 最小路径覆盖解法(必须是DAG,有向无环图) = 结点数-最大匹配 链接:https://vjudge.net/proble ...
- Guardian of Decency UVALive - 3415 最大独立集=结点数-最大匹配数 老师带大学生旅游
/** 题目:Guardian of Decency UVALive - 3415 最大独立集=结点数-最大匹配数 老师带大学生旅游 链接:https://vjudge.net/problem/UVA ...
- UVALive 5033 I'm Telling the Truth 二分图最大匹配(略有修改)
I - I'm Telling the Truth Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu ...
- UVALive 6887 Book Club 最大流解最大匹配
题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...
- UVALive 2523 Machine Schedule(二分图求最大匹配数)
题意:有两台机器,上面有多个工作区域,有多个任务,分别可以在两台机器的某一个区域上完成,两台机器一开始都在0区域上工作,每次更改区域,都会重新启动一次,让我们求出最小的重启次数. 思路:将两个区域连线 ...
- UVaLive 6525 Attacking rooks (二分图最大匹配)
题意:给定一个 n * n的图,X是卒, . 是空位置,让你放尽量多的车,使得他们不互相攻击. 析:把每行连续的 . 看成X集体的一个点,同理也是这样,然后求一个最大匹配即可. 代码如下: #prag ...
- [ An Ac a Day ^_^ ] UVALive 2635 Housing Complexes 二分图最大匹配
快要比赛了 看看原来做过的题 感觉这道题当时做的还是挺费劲的 所以发一下 题意: 一个土豪要建别墅 因为有的地区地方不够大 所以要拆屋子 每个地方的字母就是对应开发商的地盘 没有字母的就是自由土地 一 ...
- HDU 5093 Battle ships(二分图最大匹配)
题意:一个m行n列的图由#.*.o三种符号组成,分别代表冰山.海域.浮冰,问最多可放的炮舰数(要求满足以下条件) 1.炮舰只可放在海域处 2.两个炮舰不能放在同一行或同一列(除非中间隔着一个或多个冰山 ...
随机推荐
- Duilib初级控件扩展一例: 具有鼠标滚动消息的OptionUI
转载:http://www.cnblogs.com/memset/p/Duilib_MouseWheelOptionUI_Deprecated.html
- 关于python环境的一些安装设置
操作系统Redhat Linux,自带python2.6.Python程序的运行其实相当简单,只需在操作系统中安装并配置好python环境即可,和运行java需要配置jre一样(哪里简单,真简单就不会 ...
- linux下查找指定后缀的文件
1.linux下查找指定后缀的文件 例如查找当前目录下的所有后缀名时.c或.h的文件 find . -type f -regex ".*\.\(c\|h\)"
- Linq let Concat
let: String[] strs = { "A penny saved is a penny earned.", "The early bird catches th ...
- 九数组分数|2015年蓝桥杯B组题解析第五题-fishers
九数组分数 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. #include <stdio.h> void t ...
- redis.conf 配置 详解 中文 2.8
# redis version 2.8.19 # 1k => 1000 bytes# 1kb => 1024 bytes# 1m => 1000000 bytes# 1m ...
- poj 2449 Remmarguts' Date 求第k短路 Astar算法
=.=好菜 #include <iostream> #include <cstdio> #include <string.h> #include <cstri ...
- 51NOD 1087 1 10 100 1000
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1087 暴力大法 #include<bits/stdc++.h> ...
- C# Byte[] 数组操作
byte[] Strbyte = Encoding.GetEncoding("big5").GetBytes(str); if (Strbyte.Length ...
- 读书笔记:Spring boot实战
第一章 入门 Spring boot最重要的四个核心 : 1.自动配置:针对很多spring应用程序常见的应用功能,spring boot能自动提供相关配置 2.起步依赖:告诉spring boot需 ...