首页 > 代码库 > 洛谷P1341 无序字母对[无向图欧拉路]
洛谷P1341 无序字母对[无向图欧拉路]
题目描述
给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。
输入输出格式
输入格式:
第一行输入一个正整数n。
以下n行每行两个字母,表示这两个字母需要相邻。
输出格式:
输出满足要求的字符串。
如果没有满足要求的字符串,请输出“No Solution”。
如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案
输入输出样例
输入样例#1:
4aZtZXtaX
输出样例#1:
XaZtX
说明
【数据规模与约定】
不同的无序字母对个数有限,n的规模可以通过计算得到。
看似很水,实际暴露了很多问题
1.无向图欧拉路,de全为even或两个odd
2.欧拉路是vis判边走过没有不是点
3.字典序 加一个栈里逆序输出,这个栈要n*n大小
4.大小写字母虽然中间夹了几个字符,也没必要写个ID函数
5.%别打成/
//// main.cpp// luogu1341//// Created by Candy on 11/11/2016.// Copyright © 2016 Candy. All rights reserved.//#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int N=105,INF=1e9;int n,cn=58,a[N],u,v;char s[5];//inline int id(char c){if(c>=‘a‘) return c-‘a‘+26;else return c-‘A‘;}//void print(int x){if(x<26) putchar(x+‘A‘);else putchar(x-26+‘a‘);}int de[N],g[N][N];int vis[N][N],st[N*N],top=0;void dfs(int u){ for(int i=0;i<cn;i++) if(g[u][i]&&!vis[u][i]) vis[u][i]=vis[i][u]=1,dfs(i); st[++top]=u;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s); //u=id(s[0]);v=id(s[1]);//printf("edge %d %d\n",u,v); u=s[0]-‘A‘;v=s[1]-‘A‘; de[u]++;de[v]++;g[u][v]=g[v][u]=1; } int cnt=0,s1=cn,s2=cn; for(int i=0;i<=cn;i++) if(de[i]){ s1=min(i,s1); if(de[i]%2) cnt++,s2=min(i,s2); } if(cnt==0) dfs(s1); else if(cnt==2) dfs(s2); else {puts("No Solution");return 0;} while(top) putchar(st[top--]+‘A‘);}
洛谷P1341 无序字母对[无向图欧拉路]
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。