AtCoder Beginner Contest 197 F - Construct a Palindrome
题目链接
题目大意
给定 个点 条边,每条边都对应一个小写字母
问是否存在一条从 到 的路径,使得路径上的字母构成的字符串为回文串
- 若存在则输出回文串的最短长度
- 若不存在则输出
解题思路
考虑双向 (以 来思考会好理解许多)
从 ~ 的路径构成回文相当于:
- 从 ~ 的路径和从 ~ 的路径构成回文
或
- 从 ~ 的路径和从 ~ 的路径构成回文,其中 相邻
于是可以定义 来判断从 到 的路径和从 到 的路径是否构成回文
- 表示构成回文串
- 表示不构成回文串
有点类似从两头一起出发往中间靠的区间
起初一头在 号点,另一头在 号点
起初 ~ 之间没有路径,~ 之间也没有路径
所以初始化 ,并把 打包存入队列进行双向
在 的过程中:
- 当 或 相邻时更新答案
- 当 的相邻边和 的相邻边相同时,定义 的相邻节点为 , 的相邻节点为 ,那么可由 推出 ,然后把 打包存入队列继续
AC_Code
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const int N = 1e3 + 10;
int n , m , mp[N][N] , dp[N][N];
vector<int>G[N][30];
signed main()
{
cin >> n >> m ;
for(int i = 1 ; i <= m ; i ++)
{
int u , v;
char ch;
cin >> u >> v >> ch;
G[u][ch - 'a'].push_back(v);
G[v][ch - 'a'].push_back(u);
mp[u][v] = mp[v][u] = 1;
}
int res = 1e9;
queue<pair<pair<int , int> , int>>que;
que.push(make_pair(make_pair(1 , n) , 0));
dp[1][n] = 1;
while(!que.empty())
{
pair<pair<int , int> , int>q = que.front();
que.pop();
int x = q.fi.fi , y = q.fi.se , z = q.se;
if(z > res) break ;
if(x == y) res = min(res , z);
if(mp[x][y]) res = min(res , z + 1);
for(int k = 0 ; k <= 25 ; k ++)
{
for(auto i : G[x][k])
{
for(auto j : G[y][k])
{
if(dp[i][j]) continue ;
dp[i][j] = 1;
que.push(make_pair(make_pair(i , j) , z + 2));
}
}
}
}
if(res == 1e9) res = -1;
cout << res << '\n';
return 0;
}
凡所不能将我击倒的,都将使我更加强大
本文作者:GsjzTle
本文链接:https://www.cnblogs.com/GsjzTle/p/14587574.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
, ,
标签:
,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】博客园2025新款「AI繁忙」系列T恤上架,前往周边小店选购
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用perf跟踪.NET程序的mmap泄露
· 日常问题排查-空闲一段时间再请求就超时
· Java虚拟机代码是如何一步一步变复杂且难以理解的?
· 领域驱动的事实与谬误 一 DDD 与 MVC
· SQL Server 2025 中的改进
· 日常问题排查-空闲一段时间再请求就超时
· C# 14 新增功能一览,你觉得实用吗?
· 揭秘 AI 工具的系统提示词「GitHub 热点速览」
· MySQL同步ES的6种方案!
· 解密AI知识库