问题描述:
有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以连接。问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
分析:
把每个字符串看成一个图的顶点,两个字符串可以连接就形成一条有向边。相当于判断一个有向图是否存在环以及求该有向图的最长路径。
可用图的深度优先遍历算法来求解,图用邻接表表示。
1. 求解有向图是否存在环及最长路径
#define VERTEX_NUM 7
#define NOT_VISITED -1 //该顶点未被访问
#define VISITED 0 //该顶点已经被访问,但它的邻接点未被访问完成
#define FINISHED 1 //结束访问该顶点的邻接表
#define IS_CIRCLE -1
int maxLen = -1;
int getMaxLenInGraph(int adj[][VERTEX_NUM]); //返回-1表示该有向图中存在环路
int DFS_VISTI(int state[], int adj[][VERTEX_NUM], int i, int *len); //深度优先遍历
int getMaxLenInGraph(int adj[][VERTEX_NUM])
{
int state[VERTEX_NUM];
for (int i = 0; i < VERTEX_NUM; i++)
state[i] = NOT_VISITED;
int tempLen;
for (int i = 0; i < VERTEX_NUM; i++)
{
tempLen = 0;
if (state[i] == NOT_VISITED)
{
if (DFS_VISTI(state, adj, i, &