UESTC 917 方老师的分身IV --求欧拉路径
判断欧拉路径是否存在及求出字典序最小的欧拉路径问题(如果存在)。
将字符串的第一个字母和最后一个字母间连边,将字母看成点,最多可能有26个点(a-z),如果有欧拉路径,还要判断是否有欧拉回路,如果有,则需要找一个字典序最小的点开始生成这条链,否则以起点开始生成链,起点即为出度比入度大1的点。
欧拉路径是否存在的判定:
1.全部点在一个联通块 ----用并查集判联通块的数量
2.所有点出度入度相等 ----in[],out[]记录出度与入度
3.或者有一个出度比入度小1,另一个出度比入度大1(源点与汇点)
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#define Mod 1000000007
using namespace std;
#define N 2007 string ss[N]; struct node
{
int u,v,next;
string w;
}G[N]; int first[],fa[],in[],out[],vis[];
int tot,k,start;
int evis[N];
string ans[N]; void init()
{
int i;
for(i=;i<;i++)
fa[i] = i;
tot = ;
memset(in,,sizeof(in));
memset(out,,sizeof(out));
for(i=;i<=;i++)
{
G[i].u = G[i].v = G[i].next = ;
G[i].w = "";
}
memset(first,-,sizeof(first));
memset(vis,,sizeof(vis));
memset(evis,,sizeof(evis));
for(int j=;j<=;j++)
ans[j] = "";
} int findset(int x)
{
if(x != fa[x])
fa[x] = findset(fa[x]);
return fa[x];
} int cmp(string ka,string kb)
{
return ka>kb;
} void addedge(int u,int v,string w)
{
G[tot].u = u;
G[tot].v = v;
G[tot].w = w;
G[tot].next = first[u];
first[u] = tot++;
out[u]++;
in[v]++;
vis[u] = vis[v] = ;
int fx = findset(u);
int fy = findset(v);
if(fx != fy)
fa[fx] = fy;
} int Euler_Path()
{
int block = ,i;
int O = ;
int I = ;
start = -;
for(i=;i<;i++)
{
if(vis[i]) //涉及到的字母
{
int fk = findset(i);
if(fk == i)
block++;
if(block > )
return false;
if(in[i] == out[i]+) //入大出,奇度数点
I++;
else if(in[i]+ == out[i]) //出大入,奇度数点
O++,start = i;
else if(in[i] != out[i])
return false;
}
}
if(block != )
return false;
if((O == I && O == ) || (O == I && O == )) //没有奇度数点或者只有源点和汇点是奇度数点
{
if(start == -) //没有找到起点,是欧拉回路
{
for(i=;i<;i++)
{
if(vis[i] && out[i] > ) //找字典序最小的字母做起点
{
start = i;
return true;
}
}
}
//如果已找到起点,则不能是欧拉回路
if(O == I && O == )
return true;
return false;
}
return false;
} void dfs(int v,int flag)
{
for(int e=first[v];e!=-;e=G[e].next)
{
if(!evis[e]) //边没被访问
{
evis[e] = ;
dfs(G[e].v,e);
}
}
if(flag != -)
ans[k++] = G[flag].w;
} int main()
{
int t,i,j,n;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d",&n);
for(i=;i<=n;i++)
cin>>ss[i];
sort(ss+,ss+n+,cmp);
//qsort(ss+1,n,28,cmp);
for(i=;i<=n;i++)
{
int u = ss[i][]-'a';
int v = ss[i][ss[i].length()-]-'a';
addedge(u,v,ss[i]);
}
if(Euler_Path())
{
k = ;
dfs(start,-);
cout<<ans[k-];
for(i=k-;i>=;i--)
cout<<"."<<ans[i];
printf("\n");
}
else
puts("***");
}
return ;
}
UESTC 917 方老师的分身IV --求欧拉路径的更多相关文章
- UESTC 901 方老师抢银行 --Tarjan求强连通分量
思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...
- UESTC 914 方老师的分身I Dijkstra
题意:求有向图的往返最短路的最长长度. 分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来.考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果. 所以 ...
- UESTC 915 方老师的分身II --最短路变形
即求从起点到终点至少走K条路的最短路径. 用两个变量来维护一个点的dis,u和e,u为当前点的编号,e为已经走过多少条边,w[u][e]表示到当前点,走过e条边的最短路径长度,因为是至少K条边,所以大 ...
- UESTC 916 方老师的分身III --拓扑排序
做法: 如果有a<b的关系,则连一条a->b的有向边,连好所有边后,找入度为0的点作为起点,将其赋为最小的价值888,然后其所有能到的端点,价值加1,加入队列,删去上一个点,然后循环往复, ...
- UESTC_方老师的分身 II CDOJ 915
方老师的分身 II Time Limit: 10000/5000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- UESTC 898 方老师和缘分 --二分图匹配+强连通分量
这题原来以为是某种匹配问题,后来好像说是强连通的问题. 做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u-> ...
- UESTC - 900 方老师炸弹 —— 割点
题目链接:https://vjudge.net/problem/UESTC-900 方老师炸弹 Time Limit: 4000/2000MS (Java/Others) Memory L ...
- UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数
Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...
- UESTC 884 方老师的专题讲座 --数位DP
定义:cnt[L][K]表示长度为L,最高位为K的满足条件C的个数. 首先预处理出cnt数组,枚举当前长度最高位和小一个长度的最高位,如果相差大于2则前一个加上后一个的方法数. 然后给定n,计算[1, ...
随机推荐
- css中important的用处
今天看代码时遇到一段不理解的地方. #note_content { line-height: 22px; border: #DEDEDE 1px solid; background: #FAFAFA; ...
- 「C语言」C输出hello world!系统发生了什么?
本篇文章全部摘抄自学长博客供以后学习: http://efraim.me/2015/12/05/tech-linux-2015-12-05/ 排版因与博客园编辑器不同而稍作修改. 输出hello wo ...
- Hexo建博小结
本来只写在自己的github pages中的,想一想万一有人看呢,虽然同类的文章有不少了,但有些新坑他们没填啊,姑且放出来啦... 拥有自己的博客是一个很酷的事情,但自己建站总是太麻烦了,步骤繁多,管 ...
- SarePoint Powershell Add user to Group
$FromGroupnames = "001总经理","010101管理本部" $ToGroupname = "test" $SPWeb = ...
- JTS Geometry关系判断和分析
关系判断 Geometry之间的关系有如下几种: 相等(Equals): 几何形状拓扑上相等. 脱节(Disjoint): 几何形状没有共有的点. 相交(Intersects): 几何形状至少有一个共 ...
- Sharepoint学习笔记—习题系列--70-573习题解析 --索引目录
Sharepoint学习笔记—习题系列--70-573习题解析 为便于查阅,这里整理并列出了我前面播客中的关于70-573习题解析系列的所有问题,有些内容可能会在以后更新, ...
- File类的常用方法
public static void GetFileInfo() { File file=new File("e:","two.txt ...
- OC数组常见操作
// 数组存放的内容必须是NSObject对象,数组中存放的内容是有序的 // 数组打印输出在输出台是用()包括起来的 // NSArray 不可变数组 // 1.创建对象 // 初始化方法 NSAr ...
- 插入排序(java版)
public class InsertSortTest{ public static void InsertSort(int[] source) { //默认第一个元素已排序 for (int i = ...
- wordpress对显示某分类目录的文章列表页时对单个文章显示字数限制和省略
wordpress会在对应的此类列表页面模板中,遍历输出每篇文章的信息,缩略图,作者,正文,标题等, 输出具体的正文的部分 使用这样一句 <?php the_content(''); ?> ...