NYOJ 99单词拼接(有向图的欧拉(回)路)

简介: 1 /* 2 NYOJ 99单词拼接: 3 思路:欧拉回路或者欧拉路的搜索! 4 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 5 有向图的欧拉路:abs(In[i] - Out[i])=...
  1 /*
  2    NYOJ 99单词拼接:
  3    思路:欧拉回路或者欧拉路的搜索!
  4    注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE!
  5    有向图的欧拉路:abs(In[i] - Out[i])==1(入度[i] - 出度[i])的节点个数为两个 
  6    有向图的欧拉回路:所有的节点都有In[i]==Out[i] 
  7 */ 
  8 #include<iostream>
  9 #include<cstring>
 10 #include<cstdio>
 11 #include<algorithm>
 12 using namespace std;
 13 
 14 struct node{
 15    char s[35];
 16    int first, end;
 17 };
 18 
 19 bool cmp(node a, node b){
 20    return strcmp(a.s, b.s) <0;
 21 }
 22 
 23 node nd[1005];
 24 int In[30], Out[30];
 25 int order[1005], vis[1005]; 
 26 int n;
 27 
 28 int fun(){
 29     memset(vis, 0, sizeof(vis));
 30     int i;  
 31     int last=-1;  
 32     int first=-1;  
 33     //有向图欧拉路的判断 
 34     for(i=0; i<26; ++i)  
 35     {  
 36         if(In[i]!=Out[i])  
 37         {   //首先入度和出度之差的绝对值为 1的节点的要么没有,要么只有两个(没有欧拉回路,只有欧拉路)! 
 38             if(Out[i]-In[i]==1 && first==-1)  
 39                 first=i;  
 40             else if(Out[i]-In[i]==-1 && last==-1)  
 41                 last=i;  
 42             else  
 43                 return -1;  
 44         }  
 45     }  
 46     if(first>-1 && last>-1) //这种情况是 欧拉路的搜索 ! 
 47         return first;  
 48     else if(first==-1 && last==-1) //这种是欧拉回路的搜索! 
 49     {  
 50         for(i=0; i<26; ++i)  
 51             if(In[i]!=0)  
 52                 return i;  
 53     }  
 54     else  
 55         return -1;  
 56 }
 57 
 58 bool dfs(int st, int cnt){ 
 59    if(cnt == n)
 60       return true; 
 61    int ld=0, rd=n-1;
 62    while(ld<=rd){
 63        int mid=(ld+rd)/2;
 64        if(nd[mid].first<st)
 65            ld=mid+1;
 66        else rd=mid-1; 
 67    }
 68    int m=rd+1;
 69    if(nd[m].first > st) return false;
 70    for(int i=m; i<n; ++i)
 71       if(!vis[i]){          
 72             if(nd[i].first > st)
 73                return false;
 74             if(nd[i].first == st){
 75               vis[i]=1;
 76               order[cnt]=i;
 77               if(dfs(nd[i].end, cnt+1)) return true; 
 78               vis[i]=0;    
 79           }
 80       } 
 81    return false;
 82 }
 83 
 84 
 85 int main(){
 86    int t;
 87    scanf("%d", &t);
 88    while(t--){
 89       scanf("%d", &n);
 90       memset(In, 0, sizeof(In));
 91       memset(Out, 0, sizeof(Out));
 92       for(int i=0; i<n; ++i){
 93          scanf("%s", nd[i].s);
 94          nd[i].first=nd[i].s[0]-'a';
 95          nd[i].end=nd[i].s[strlen(nd[i].s)-1]-'a';
 96          ++Out[nd[i].first];
 97          ++In[nd[i].end];
 98       } 
 99         
100          int st = fun();
101          //因为搜索的是字典序的第一个,所以将字符串从小到大排一下序!在搜索的时候按照升序搜索组合! 
102          sort(nd, nd+n, cmp);
103          if(st==-1 || !dfs(st, 0))
104             printf("***\n");
105          else{
106             printf("%s", nd[order[0]].s);
107             for(int i=1; i<n; ++i)
108                printf(".%s", nd[order[i]].s);
109             printf("\n");
110          } 
111    }
112    return 0;
113 } 

 

目录
相关文章
|
1天前
|
人工智能 运维 安全
|
4天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
377 124
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
|
6天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
616 107
|
3天前
|
Java 数据库 数据安全/隐私保护
Spring 微服务和多租户:处理多个客户端
本文介绍了如何在 Spring Boot 微服务架构中实现多租户。多租户允许单个应用实例为多个客户提供独立服务,尤其适用于 SaaS 应用。文章探讨了多租户的类型、优势与挑战,并详细说明了如何通过 Spring Boot 的灵活配置实现租户隔离、动态租户管理及数据源路由,同时确保数据安全与系统可扩展性。结合微服务的优势,开发者可以构建高效、可维护的多租户系统。
198 127
|
3天前
|
Web App开发 前端开发 API
在折叠屏应用中,如何处理不同屏幕尺寸和设备类型的样式兼容性?
在折叠屏应用中,如何处理不同屏幕尺寸和设备类型的样式兼容性?
224 124
|
3天前
|
人工智能 数据可视化 测试技术
Coze平台指南(3):核心功能-创建智能体与设计角色
Coze 智能体是由大语言模型驱动,通过提示词设定角色,并借助知识库、插件和工作流扩展能力,以执行特定任务的AI助手。对测试工程师而言,精心设计的智能体可显著提升测试效率与质量,关键是要准确理解测试需求,并将其转化为智能体的角色设定和功能配置。建议进一步学习知识库与工作流,以深化应用。
|
7天前
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;