ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AtCoder Beginner Contest 197 F - Construct a Palindrome

2021-03-31 21:32:02  阅读:427  来源: 互联网

标签:node AtCoder Palindrome Beginner int 枚举 maxl ans dis


https://atcoder.jp/contests/abc197/tasks/abc197_f

过了一车人的套路我不会。。。

把题目转化成二维平面的模型,dis[u][v]表示从1到u,从n到v,一直走相同字母的距离

然后我们枚举每个点u:{s,e}的所有边,得到u:{s,e}->v:{s.v,e.v}这样的边,且他们走是相同的字母,这样枚举最大是m^2的

然后bfs就可以了,然后枚举中间dis[i][i]*2和dis[i][j]*2+1,i,j,中间有边,答案取最小方案就可以了

注意答案不能直接取dis[1][n]->dis[n][1]

4 4

1 2 b

2 4 a

1 3 a

3 4 b

这样从(1,n)走到(n,1)是一个环,但不是回文串

 

#include<bits/stdc++.h>
using namespace std;

const int maxl=1010;

int n,m,ans;
int dis[maxl][maxl];
struct ed{int v,l;}; 
vector<ed> e[maxl];
struct node{int s,e;};
vector<node> g[maxl][maxl];
char s[10];
bool vis[maxl][maxl];

inline void prework()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);vis[u][v]=vis[v][u]=true;
		scanf("%s",s);
		e[u].push_back(ed{v,s[0]-'0'});
		e[v].push_back(ed{u,s[0]-'0'});
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			for(ed e1:e[i])
				for(ed e2:e[j])
				if(e1.l==e2.l)
					g[i][j].push_back(node{e1.v,e2.v});
}

inline void mainwork()
{
	memset(dis,0x3f,sizeof(dis));
	dis[1][n]=0;int inf=dis[0][0];
	queue<node> q;q.push(node{1,n});
	while(!q.empty())
	{
		node u=q.front();q.pop();
		for(node v:g[u.s][u.e])
		if(dis[v.s][v.e]==inf)
		{
			dis[v.s][v.e]=dis[u.s][u.e]+1;
			q.push(node{v.s,v.e});
		}
	}
	ans=inf;
	for(int i=1;i<=n;i++)
	{
		ans=min(ans,dis[i][i]*2);
		for(int j=1;j<=n;j++)
		if(vis[i][j])
			ans=min(ans,dis[i][j]*2+1);
	}
}

inline void print()
{
	if(ans==dis[0][0])
		ans=-1;
	printf("%d",ans);
}

int main()
{
	prework();
	mainwork();
	print();
	return 0;
}

 

标签:node,AtCoder,Palindrome,Beginner,int,枚举,maxl,ans,dis
来源: https://blog.csdn.net/liufengwei1/article/details/115361184

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有