Luogu P1341 无序字母对
突然发现我现在很喜欢打图论题。
然而都是很easy的。
这道题很坑,用C++打了一遍莫名Too many or too few lines。
然后我打出了我的独门绝技Pascal。这可能是我最后一次用Pascal了。
开始讲思路。
首先每两点必须相连但无关方向,然后我们发现,可以跑一遍哈密顿回路来搞出答案。
记录与每个点相连的边。
统计一下向连边为奇数的点的个数。
0个:找一个字典序最小的点dfs
2:个:在两个奇点里找一个字典序最小的dfs
其他:无解
dfs时尽量选字典序小的,贪心即可
由于范围小就用邻接矩阵来存了(f[i,j]表示i,j有边相连,e[i]为i点的相连边数)
CODE
uses math;
var
e:array[..*+] of longint;
f:array[..,..] of boolean;
i,j,n,minn,u,v,t,tot:longint;
x,y:char;
ans:array[..*+] of char;
procedure dfs(k:longint);
var i:longint;
begin
for i:= to do
if f[k,i] then
begin f[k,i]:=false; f[i][k]:=false;
dfs(i); end;
inc(tot); ans[tot]:=chr(k+ord('A'));
end;
begin
readln(n); minn:=;
for i:= to n do
begin readln(x,y); u:=ord(x)-ord('A'); v:=ord(y)-ord('A');
minn:=min(minn,min(u,v));
f[u,v]:=true; f[v,u]:=true;
inc(e[u]); inc(e[v]); end;
for i:= to do
if e[i] mod = then inc(t);
if t= then dfs(minn) else
if t= then begin minn:=; for i:= to do if e[i] mod = then minn:=min(minn,i); dfs(minn); end else
begin writeln('No Solution'); halt; end;
for i:=tot downto do write(ans[i]);
end.
发一把C++的,只有10分被狗了(应该是输入输出的问题)。
CODE
#include<cstdio>
#include<iostream>
using namespace std;
const int N=;
int n,i,e[N],t,tot;
bool f[N][N];
char ans[N];
void dfs(int k)
{
for (int i=;i<=N;++i)
if (f[k][i])
{
f[k][i]=f[i][k]=;
dfs(i);
}
ans[++tot]=k;
}
int main()
{
//freopen("testdata.in","r",stdin); freopen("luogu.out","w",stdout);
scanf("%d",&n); getchar();
for (i=;i<=n;++i)
{
char x=getchar(),y=getchar();
getchar();
f[x][y]=f[y][x]=;
e[x]++; e[y]++;
}
for (i=;i<=N;++i)
if (e[i]%) t++;
if (t==)
{
int x1,x2;
for (i=;i<=N;++i)
if (e[i]%) { x1=i; break; }
for (i+=;i<=N;++i)
if (e[i]%) { x2=i; break; }
dfs(min(x1,x2));
} else if (t==)
{
for (i=;i<=N;++i)
if (e[i]) break;
dfs(i);
} else { puts("No Solution"); return ; }
for (i=tot;i;--i)
printf("%c",ans[i]);
return ;
}
%%%
Luogu P1341 无序字母对的更多相关文章
- 洛谷 P1341 无序字母对 解题报告
P1341 无序字母对 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 ...
- 洛谷P1341 无序字母对(欧拉回路)
P1341 无序字母对 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 ...
- 洛谷 P1341 无序字母对(欧拉路)
P1341 无序字母对 题目提供者yeszy 标签 福建省历届夏令营 难度 提高+/省选- 最新讨论 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造 ...
- P1341 无序字母对【欧拉路径】- Hierholzer模板
P1341 无序字母对 提交 24.87k 通过 6.80k 时间限制 1.00s 内存限制 125.00MB 题目提供者yeszy 难度提高+/省选- 历史分数100 提交记录 查看题解 标签 福建 ...
- P1341 无序字母对(欧拉回路)
题目链接: https://www.luogu.org/problemnew/show/P1341 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一 ...
- 洛谷P1341 无序字母对[无向图欧拉路]
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- 洛谷 P1341 无序字母对 Label:欧拉路 一笔画
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- P1341 无序字母对 欧拉回路
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- P1341 无序字母对
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
随机推荐
- MVC与单元测试实践之健身网站(五)-系统信息、前台入口
Fit项目停滞了一段时间,现在继续吧.上一篇完成了动作文本和配图的添加.编辑等内容.接下来要完成的是后台的最后一个模块:系统信息:以及前台的入口:关于注册.登录.修改密码等. 一 系统信息 a) 用户 ...
- Android解析XML文件
XML文件和获取XML值 XML文件样例 <?xml version="1.0" encoding="utf-8"?> <citys> ...
- Android事件总线(四)源码解析otto
前言 上一篇文章中讲到了otto的用法,这一篇我们来讲一下otto的源码.可能有人觉得otto过时了,但是通过源码我们学习的是高手设计otto时的设计理念,这种设计理念是不过时的. otto各个类的作 ...
- 为Hexo Next主题添加分享及打赏功能
博客地址:往事亦如风的博客 要想先看打赏和分享功能效果,请移步我的博客 打赏功能 因为next主题自带打赏功能,所以我们只需要在next的主题配置文件中找到如下代码,image文件夹是我在blog/s ...
- 数据层的多租户浅谈(SAAS多租户数据库设计)
在上一篇“浅析多租户在 Java 平台和某些 PaaS 上的实现”中我们谈到了应用层面的多租户架构,涉及到 PaaS.JVM.OS 等,与之相应的是数据层也有多租户的支持. 数据层的多租户综述 多租户 ...
- 根据id来大量删除数据between
id的范围来删除数据 比如要删除 110到220的id信息:delete id from 表名 where id between 110 and 220;
- MySql数据库基础笔记(一)
一.表与库的概念 数据库管理数据,它是以什么样的形式组成的? 生活中的表---->表 table多行多列,传统的数据库都是这样的;声明了表头,一个表创建好了,剩下的就是往表中添加数据 多张表放在 ...
- 【PAT】B1057 数零壹(20 分)
简单题,简单字符串处理加简单数学进制转换 #include<stdio.h> #include<string.h> #include<ctype.h> int ma ...
- 初识Python - Python的历史(转)
声明: 本文转自维基百科 如有意见请联系删除 综述 该编程语言 的Python是在20世纪80年代末的设想,和实施是在1989年12月开始由吉多·范罗苏姆在CWI在荷兰的继任者农行能够异常处理,并与接 ...
- C语句详细(初学者)
C程序的执行部分是由语句组成的.程序的功能也是由执行语句实现的. C语句分为以下六类: 1.表达式语句:表达式加上分号“:”组成.执行表达式语句就是计算表达式的值. 2.函数调用语句:函数名.实际参数 ...