bzoj 1138: [POI2009]Baj 最短回文路
额,,貌似网上的题解都说超时之类的。
然而我这个辣鸡在做的时候不知道在想什么,连超时的都不会。
超时的大概是这样的,f[x][y]表示x到y的最短回文路,然后更新的话就是 f[x][y]更新到 f[a][b] 当x->a,y->b且边的颜色是一样的。
然后yy了一下为什么会超时呢。。。。
然后想到了一个sb的情况。。两个菊花图连起来。。。这样的复杂度就呵呵呵了。。每次用f[x][y]更新的话都要枚举一个颜色,然后把另一边的颜色找出来,这样显然是要爆炸的。
为了避免这种sb情况,就引入了一个叫题解的神奇的东西。
题解多设了一个东西,g[x][y][col]表示x到y且除了和y相连的那条颜色为col的边之外是回文最短路的长度。
然后有了g,就可以在一遍更新过g,f在另一边直接拿来用了。神奇2333
#include<iostream>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std; const int maxn=;
const int QWQ=; struct edge{
int to,from,next;
}e[maxn<<],E[maxn<<];
int head[QWQ],cnt,HEAD[QWQ],CNT;
void insert(int x, int y)
{
e[++cnt].next=head[x]; e[cnt].to=y; e[cnt].from=x; head[x]=cnt;
E[++CNT].next=HEAD[y]; E[CNT].to=x; E[CNT].from=y; HEAD[y]=CNT;
} int l,r=;
int n,m,map[QWQ][QWQ],f[QWQ][QWQ],g[QWQ][QWQ][];
struct node{
int from,to,col;
}q[QWQ*QWQ*];
void bfs()
{
while (l<r)
{
node u=q[l++];
int x=u.from,y=u.to;
if (!u.col)
{
for (int i=head[y];i;i=e[i].next)
{
if (f[x][y]+<g[x][e[i].to][map[y][e[i].to]])
{
g[x][e[i].to][map[y][e[i].to]]=f[x][y]+;
q[r++]=(node){x,e[i].to,map[y][e[i].to]};
}
}
}
else
{
for (int i=HEAD[x];i;i=E[i].next)
{
if (g[x][y][map[E[i].to][x]]+<f[E[i].to][y])
{
f[E[i].to][y]=g[x][y][map[E[i].to][x]]+;
q[r++]=(node){E[i].to,y,};
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(f,0x3f,sizeof(f)); memset(g,0x3f,sizeof(g));
for (int i=; i<=m; i++)
{
int x,y; char Orz[];
scanf("%d%d%s",&x,&y,Orz);
insert(x,y);
map[x][y]=Orz[]-'a'+;
f[x][y]=;
q[r++]=(node){x,y,};
}
for (int i=; i<=n; i++) f[i][i]=,q[r++]=(node){i,i,};
bfs();
int T; scanf("%d",&T);
int x,y; scanf("%d",&x);
for (int i=; i<=T; i++)
{
scanf("%d",&y);
if (f[x][y]!=inf) cout<<f[x][y]<<endl;
else puts("-1");
x=y;
}
return ;
}
bzoj 1138: [POI2009]Baj 最短回文路的更多相关文章
- bzoj 1138: [POI2009]Baj 最短回文路 dp优化
1138: [POI2009]Baj 最短回文路 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 161 Solved: 48[Submit][Sta ...
- [BZOJ1138][POI2009]Baj 最短回文路
[BZOJ1138][POI2009]Baj 最短回文路 试题描述 N个点用M条有向边连接,每条边标有一个小写字母. 对于一个长度为D的顶点序列,回答每对相邻顶点Si到Si+1的最短回文路径. 如果没 ...
- [Swift]LeetCode214. 最短回文串 | Shortest Palindrome
Given a string s, you are allowed to convert it to a palindrome by adding characters in front of it. ...
- [python,2019-02-15] 最短回文串
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...
- leetcode 214. 最短回文串 解题报告
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...
- 214 Shortest Palindrome 最短回文串
给一个字符串 S, 你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串.例如:给出 "aacecaaa",返回 "aaacecaaa ...
- Leetcode 214.最短回文串
最短回文串 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: &qu ...
- Java实现 LeetCode 214 最短回文串
214. 最短回文串 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出 ...
- [LeetCode] Shortest Palindrome 最短回文串
Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. ...
随机推荐
- 如何安装部署和优化Tomcat?(Tomcat部署和优化与压测,虚拟主机配置,Tomcat处理请求的过程)
文章目录 前言 一:Tomcat安装部署 1.1:Tomcat简介 1.2:Tomcat核心组件 1.3:Tomcat处理请求的过程 1.3.1:请求过程基本解释 1.3.2:请求过程详细解释 1.4 ...
- HTML、HTML5重难点
一.XHTML与HTML的区别 文档结构 XHTML DOCTYPE 是强制性的 <html>中的 XML namespace 属性是强制性的 <html>.<head& ...
- python 中的生成器(generator)
生成器不会吧结果保存在一个系列里,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopTteration异常结束 1.生成器语法: 生成器表达式:通列表解析语法,只不过把列表解析的[] ...
- day4-1深入理解对象之创建对象
深入理解对象 之创建对象: 工厂模式: 工厂模式虽然解决了创建\多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型) 工厂模式问题:那就是识别问题,因为根本无法 搞清楚他们到底是 ...
- Flatpak 1.5.2 即将发布
导读 Flatpak 1.5.1开发版本为Flatpaks的受保护/经过身份验证的下载提供了初始支持,这是基础架构的工作,旨在允许Flathub或Linux上其他基于Flatpak的“应用程序商店”中 ...
- 认识iOS系统架构
关于本文: 文章主要介绍iOS系统架构中的四层结构的内容.常用的框架.大致的功能,然后对iOS开发人员的发展提出自己的一些拙见. 一.iOS系统是基于UNIX系统,所有从系统稳定性上来说的确比其他操作 ...
- 「NOWCODER」CSP-S模拟赛第3场
「NOWCODER」CSP模拟赛第3场 T1 货物收集 题目 考场思路即正解 T2 货物分组 题目 考场思路 题解 60pts 算法:一维 DP 100pts 算法:一维 DP ?线段树 + 单调栈 ...
- rally问题合集
rally 执行过程中涉及到keystone的用例,需要调用adminurl,在-/rally/lib/python2.7/site-packages/rally/osclients.py(主机文件的 ...
- Mac OS 下升级gcc遇到的坑
为了升级gcc,原来版本是4.8,想升级到4.9,因为在Mac上安装cocoNLP一直出错,想试试看是不是gcc版本太低的原因,因此在此想要升级到4.9 经历了三个问题: - brew update太 ...
- 关于req.params、req.query、req.body等请求对象
请求对象,通常传递到回调方法,这意味着你可以随意命名,通常命名为 req 或 request . 请求对象中最常用的属性和方法有: req.params 一个数组,包含命名过的路由参数. req.pa ...