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. ...
随机推荐
- 设计模式课程 设计模式精讲 3-4 依赖倒置原则讲解+coding
1 课程讲解 1.1 定义 1.2 优点 1.3 细节描述 2 代码演练 2.0 代码展示优点 2.1 非面向接口编程 2.2 面向接口编程1 传参 2.3 面向接口编程2 构造函数 2.4 面向接口 ...
- 02.当构造参数过多时使用builder模式
前言 <Effective Java>中文第三版,是一本关于Java基础的书,这本书不止一次有人推荐我看.其中包括我很喜欢的博客园博主五月的仓颉,他曾在自己的博文<给Java程序猿们 ...
- input输入文字的时候背景会变色,如何去掉呢?
默认,如图: 当input框输入文字的时候背景会变色,如图: 有两种方法: 1.在form标签里家这个属性就行: autocomplete="off"
- JavaScript高级特征之面向对象笔记二
Prototype 1. 当声明一个函数的时候,浏览器会自动为该函数添加一个属性prototype, 2. 该属性的默认值为{} 3. 可以动态的给prototype增加key和value值 4 ...
- Java基础 -2.4
字符型char类型 在任何的编程语言之中,字符都可以与int进行互相转换,也就是这个字符中所描述的内容可以通过int获取其内容所在的系统编码 public class ddd { public sta ...
- 第2节 Scala中面向对象编程:9、getClass和classOf;10、调用父类的constructor;11、抽象类和抽象字段;
6.3.4. Scala中getClass 和 classOf Class A extends class B B b=new A b.getClass ==classOf[A] B b ...
- 第2节 Scala中面向对象编程:7、继承的概念以及override和super关键字;8、isInstanceOf 和 asInstanceOf关键字
6.3. Scala面向对象编程之继承 6.3.1. Scala中继承(extends)的概念 Scala 中,让子类继承父类,与 Java 一样,也是使用 extends 关键字: 继承 ...
- 学习不一样的Vue1:环境搭建
学习不一样的Vue1:环境搭建 发表于 2017-05-31 | 分类于 web前端| | 阅读次数 11677 首先 首发博客: 我的博客 项目源码: 源码 项目预览: 预览 因为个人的喜好 ...
- Python内置模块-logging
一.初识logging模块 import logging logging.debug("debug message") #级别最低,只有在诊断问题时才有兴趣的详细信息. loggi ...
- UniGUI之提示信息MessageDlg及获得信息Prompt(15)
UniGui的信息弹出框MessageDlg的原型定义如下: procedure MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons ...