【洛谷P1127】词链

news/2025/2/24 23:04:12/文章来源:https://www.cnblogs.com/namelessstory/p/18735198

今天又来学习图论喵!

我们今天主要讲解一个东西:欧拉回路(路径)
什么是欧拉路径呢?
当然是指一笔画能把所有边都过一遍(包括重边)
而欧拉回路就是指起点和终点一样的回路
那么 我们怎么输出欧拉回路呢?
首先 我们要了解一个性质 在有向图里,如果存在欧拉路径 那么它存在有且仅有一个点出度比入度大一(起点),一个点入度比出度大一(终点),其他点入度和出度相等或者所有点入度等于出度(欧拉回路)
在无向图 就是直接度数为奇数的点就是起点
当然,存在欧拉回路的必要条件还有一个:图是连通的,不存在孤立的点
这个可以用并查集/DFS/以后学的tarjan缩点啥的判断
我们先看一下有向图欧拉路径的模版:
(通常会要求字典序最小,这个时候要排个序)最后用栈倒序输出
而且一般用邻接矩阵或者vector邻接表 链式前向星不好排序
洛谷P7771 欧拉路径

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
int x,y,sx=1;
int del[100005];
int snum,fnum;
vector<int>ver[100005];
stack<int>s;
int rd[100005],cd[100005];
void dfs(int x){for(int i=del[x];i<ver[x].size();i=del[x]){del[x]=i+1;dfs(ver[x][i]);}s.push(x);
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);rd[y]++;cd[x]++;ver[x].push_back(y);}for(int i=1;i<=n;i++) sort(ver[i].begin(),ver[i].end());bool flag=true;for(int i=1;i<=n;i++){if(rd[i]==cd[i]) continue;else{flag=false;if(rd[i]==cd[i]+1){fnum++;}else if(cd[i]==rd[i]+1){snum++;sx=i;}else{cout<<"No";system("pause");return 0;}}}if(!flag&&!(snum==1&&fnum==1)){cout<<"No";system("pause");return 0;}  dfs(sx);while(!s.empty()){cout<<s.top()<<' ';s.pop();}system("pause");return 0;
}

然后再看一下无向图的:
洛谷P2731 骑马修栅栏

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int m,n;
int ma[505][505];
int d[505];
int x,y;
int st=505;
stack<int>s;
void dfs(int now){for(int i=1;i<=n;i++){if(ma[now][i]>=1){ma[now][i]--;ma[i][now]--;dfs(i);}}s.push(now);
}
int main(){scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);n=max(n,max(x,y));st=min(st,min(x,y));ma[x][y]++;ma[y][x]++;d[x]++;d[y]++;}for(int i=1;i<=n;i++){if(d[i]%2){st=i;break;}}dfs(st);while(!s.empty()){cout<<s.top()<<endl;s.pop();}system("pause");return 0;
}

那么 进入我们今天的重点:A的第一道蓝题 词链!
看看题目:

P1127 词链

题目描述

如果单词 \(X\) 的末字母与单词 \(Y\) 的首字母相同,则 \(X\)\(Y\) 可以相连成 \(X.Y\)。(注意:\(X\)\(Y\) 之间是英文的句号 .)。例如,单词 dog 与单词 gopher,则 doggopher 可以相连成 dog.gopher

另外还有一些例子:

  • dog.gopher
  • gopher.rat
  • rat.tiger
  • aloha.aloha
  • arachnid.dog

连接成的词可以与其他单词相连,组成更长的词链,例如:

aloha.arachnid.dog.gopher.rat.tiger

注意到,. 两边的字母一定是相同的。

现在给你一些单词,请你找到字典序最小的词链,使得每个单词在词链中出现且仅出现一次。注意,相同的单词若出现了 \(k\) 次就需要输出 \(k\) 次。

输入格式

第一行是一个正整数 \(n\)\(1 \le n \le 1000\)),代表单词数量。

接下来共有 \(n\) 行,每行是一个由 \(1\)\(20\) 个小写字母组成的单词。

输出格式

只有一行,表示组成字典序最小的词链,若不存在则只输出三个星号 ***

输入输出样例 #1

输入 #1

6
aloha
arachnid
dog
gopher
rat
tiger

输出 #1

aloha.arachnid.dog.gopher.rat.tiger

说明/提示

  • 对于 \(40\%\) 的数据,有 \(n \leq 10\)
  • 对于 \(100\%\) 的数据,有 \(n \leq 1000\)

解法&&个人感想:

看到欧拉回路已经有思想了
首先并查集判断连通性 找起点 然后终点输出
这题是n个 所以搜索带个数量 到n就输出
好了 就是我们的思想了:
把首尾字母视为边!而不是单词!然后用结构体存边(单词)
首先 如果是单词你不好处理像单词只有一个字母的情况
而且 如果是3 w w w这样的极端样例也不好处理
而这点我也是参考其他大佬的解法才看出来的
唉 还是比较菜
下面 我们开始吧!

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s[1005];
int n;
int fa[27];
int rd[27];
int cd[27];
int sx,fx;
int sum;
struct node{int to;int num;string a;
};
vector<node>ver[1005];
int cnt=0;
int st[1005];
int exist[27];
int del[27];
string res[1005];
int total_u;
int vis[1005];
int get(int x){if(fa[x]==x) return x;return fa[x]=get(fa[x]);
}
void merge(int x,int y){fa[get(x)]=get(y);return ;
}
void dfs(int now,int num,int count){if(count==n){for(int i=1;i<=sum;i++){if(i!=1) cout<<'.';cout<<res[i];}system("pause");exit(0);}for(int i=0;i<ver[now].size();i++){if(vis[ver[now][i].num]) continue;else{res[++sum]=ver[now][i].a;vis[ver[now][i].num]=1;dfs(ver[now][i].to,ver[now][i].num,count+1);sum--;vis[ver[now][i].num]=0;}//记得回溯}return ;
}
int main(){scanf("%d\n",&n);for(int i=1;i<=n;i++){cin>>s[i];}sort(s+1,s+1+n);for(int i=1;i<=n;i++){int s_begin=s[i][0]-'a'+1;int s_end=s[i][s[i].length()-1]-'a'+1;rd[s_end]++;cd[s_begin]++;if(!exist[s_begin]){//记录这个字母是否出现过fa[s_begin]=s_begin;total_u++;exist[s_begin]=1;}if(!exist[s_end]){fa[s_end]=s_end;total_u++;exist[s_end]=1;}if(s_begin!=s_end){//如果不是自环就连接if(get(s_begin)!=get(s_end)){merge(s_begin,s_end);total_u--;}}node tem;tem.to=s_end;tem.num=i;tem.a=s[i];ver[s_begin].push_back(tem);//建图}int ssum=0,fsum=0;for(int i=1;i<=26;i++){if(!exist[i]) continue;else if(rd[i]==cd[i]) continue;else if(rd[i]==cd[i]+1){fsum++;fx=i;}else if(rd[i]+1==cd[i]){sx=i;ssum++;}else{printf("***");system("pause");return 0;}}if(total_u!=1){printf("***");system("pause");return 0;}if(!((ssum==0&&fsum==0)||(ssum==1&&fsum==1))){printf("***");system("pause");return 0;}if(ssum==0&&fsum==0){sx=s[1][0]-'a'+1;}dfs(sx,0,0);system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889251.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

朋友说喊搞个简单的微信对接的封装搞外包,不要那么多的方法拿来就用的的那种,来看看Simple.Wechat吧

朋友说喊搞个简单的微信对接的封装搞外包,不要那么多的方法拿来就用的的那种,来看看Simple.Wechat吧😂不知道大家有没有和我朋友一样,很多时候做外包总免不了去对接微信,最简单的微信用户信息获取、微信支付、微信模板消息发送,要是不熟悉总是要去找这个那个的包,但是人…

龙哥量化:二重奏啊!同时用deepseek和腾讯元宝的Hunyuan大模型写技术指标和选股公式,把收集的公式源码传给他,可以像人一样思考

龙哥微信:Long622889代写通达信技术指标、选股公式(通达信,同花顺,东方财富,大智慧,文华,博易,飞狐)代写期货量化策略(TB交易开拓者,文华8,金字塔) 开源的deepseek非常爆火,大科技公司都纷纷接入ds。腾讯元宝也接入了, 可以选Hunyuan或者deepseek模型给你帮忙,…

【APP逆向35】frida反调试2

前言:有些app运行时会监测frida的相关特征,监测到之后就会直接闪退 示例:解决方法:可以尝试使用strongR-frida-android来绕过监测1.下载frida-server(加强版)下载地址:https://github.com/hzzheyang/strongR-frida-android/releases?page=4 找到frida对应的版本解压,上…

【作业】自我介绍

软件工程学第一节课作业:自我介绍+软工5问作业相关信息这个作业属于哪个课程🔗班级链接 这个作业要求在哪里🔗作业链接 这个作业的目标 1. 自我介绍 2. 软工五问作业一: 自我介绍 🚩Hi! I am Mike, a technology learner enthusiastic in new ideas and programs. Toge…

磁盘总结---特殊符号系列-正则概述

1.系统管理-补充 文件系统: 磁盘中文件的组织方式常见文件系统 说明xfs centos 7默认的文件系统即可ext4 centos 6.x ubuntu 默认的文件系统ext3 centos 5.x 默认的文件系统swap 交换分区,也算是个文件系统2.磁盘性能指标磁盘性能指标 说明吞吐量(读写速度) 一般值得是磁盘读…

多态的前提--java进阶day02

1.多态的前提条件第一点和第二点都很好理解,第三点父类引用指向子类对象是什么意思?以下图进行讲解我们以前的写法,如下图,叫做子类引用指向子类那父类引用呢?就是把左边换成父类Animal即可因为dog和cat都是Animal的子类,所以二者皆可用该种引用方式并不是所有的对象都可…

行内块应用

这是做的作业<!DOCTYPE html> <html lang="zh-cn"> <head><meta charset="UTF-8"><title>Title</title><style>.pics {width: 1850px;height: 700px;display: flex;justify-content: center; /* 水平居中 */ali…

基于NURBS曲线的数据拟合算法matlab仿真

1.程序功能描述 基于NURBS曲线的数据拟合算法,非均匀有理B样条(Non-Uniform Rational B-Splines,简称NURBS)曲线是一种强大的数学工具,广泛应用于计算机图形学、CAD/CAM系统、几何建模和数据拟合等领域。NURBS曲线通过控制顶点和权重,能够精确地表示复杂的曲线和曲面…

基于simulink的PEM燃料电池控制系统建模与仿真,对比PID,积分分离以及滑模控制器

1.课题概述 基于simulink的PEM燃料电池控制系统建模与仿真,对比PID,积分分离以及滑模控制器。2.系统仿真结果 (完整程序运行后无水印) 3.核心程序与模型 版本:MATLAB2022a 4.系统原理简介PEM(质子交换膜)燃料电池作为一种高效的能量转换装置,在众多领域中展现出广泛的应…