`
人生难得糊涂
  • 浏览: 117367 次
社区版块
存档分类
最新评论

poj2337_单词接龙欧拉回路

 
阅读更多

整整一天都在弄这个 ,终于AC了 。

需要注意的地方都在代码注释里了!

 

 

#include<iostream>   
#include<cstdio>   
#include<string>   
#include<algorithm>  
using namespace std;
#define EMAX 1030
int t,n;
int num;//记录边数目
int vis[30];
int head[EMAX];
int next[EMAX];
int fa[30];
int in[30];
int out[30];
int stk[EMAX];//记录打印顺序
int top;
string str[EMAX];
struct node
{
	int u;//起点
	int v;//终点
	string s;
	int flag;
};
node edge[EMAX];
int num1,num2;

void init()
{
	num=0;
	top=0;
	memset(in,0,sizeof(in));
	memset(out,0,sizeof(out));
	memset(vis,0,sizeof(vis));
	memset(head,-1,sizeof(head));
	memset(next,-1,sizeof(next));
	for(int i=0;i<30;i++)
		fa[i]=i;
	
}

//添加边的方法
void addnode(int u,int v,string s)
{
	edge[num].u=u;
	edge[num].v=v;
	edge[num].s=s;
	edge[num].flag=0;
	next[num]=head[u];
	head[u]=num++;
}

//find 
int find(int a)
{
	if(a==fa[a])
		return a;
	else 
		return fa[a]=find(fa[a]);
}

bool cmp(string a,string b)
{     
	return a>b; //因为是用头插法建立节点 所有必须从大到小排序
	
}  

int iseuler()
{
	// 第一个条件
	int fnum=0;
	int i;
	for(i=1;i<=26;i++)
		if(vis[i]&&find(i)==i)
			fnum++;
		if(fnum>1)
			return 0;
		//第二个条件
		num1=num2=0;
		for(i=1;i<=26;i++)
			if(vis[i]&&in[i]!=out[i])
			{
				if(in[i]-out[i]==1)
					num1++;
				else if(out[i]-in[i]==1)
					num2++;
				else 
					return 0;
			}
			if(num1==1&&num2==1)
				return 1;
			if(num1==0&&num2==0)
				return 1;
			return 0;
}

void dfs(int from)
{
	for(int i=head[from];i!=-1;i=next[i])
	{
		if(!edge[i].flag)
		{
			edge[i].flag=1;
			dfs(edge[i].v);
			stk[top++]=i;
	
		}
	}
}

int main()
{
	//freopen("in.txt","r",stdin);
	scanf("%d",&t);
	
	while(t--)
	{
		int i;
		scanf("%d",&n);
		init();//初始化
		for(i=0;i<n;i++)
		{
		//	scanf("%s",str[i]);
			cin>>str[i];
		}
		
		//排序
		sort(str,str+n,cmp);
		for(i=0;i<n;i++)
		{
			int u=str[i][0]-'a'+1;//顶点从1到26
			int v=str[i][(str[i].length())-1]-'a'+1;
			vis[u]=1;
			vis[v]=1;
			out[u]++;
			in[v]++;
			if(find(u)!=find(v))
				fa[find(v)]=find(u);
			
			addnode(u,v,str[i]);//边从0到num
		}
		if(iseuler())
		{
			int start;//起点的选择:如果是欧拉通路 则选择出度比入度大一的那个点,
			//否则选字典序最小的那个点!!  这点很重要!
			
			//选择入口
			if(num1==1&&num2==1)
			{
				for(int k=0;k<num;k++)
				{
					if(out[edge[k].u]-in[edge[k].u]==1)
					{
						start=k;
						break;
					}
				}
			}
			else 
			{
				start=num-1;//选字典序最小的那个dian 
			}
			dfs(edge[start].u);
			for(i=num-1;i>0;i--)
				cout<<edge[stk[i]].s<<".";
			cout<<edge[stk[i]].s<<endl;
		}
		else
		{
			printf("***\n");
		}
		
	}
	return 0;
}

 因为该题要按字典序输出,我就再这里WA了好久 ,,一开始我是将各个字符串从小到大排序,而我采用的是头插法建立节点。这样同一起点的单词 不一定会按照从小到大的排序的。 如ab aba 。所以应该从大到小排序。

还有一点要注意的是

选择起点:如果是欧拉通路选择出度比入度大一的点,如果是回路,则选择字典序最小的那个点,以它为入口

0
0
分享到:
评论

相关推荐

    jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c

    标题中的"jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c" 提到了一个压缩文件,可能包含有关编程竞赛或算法解决的资源,特别是与POJ(Problem On Judge)平台上的问题3714相关的。"Ra_visual c"可能指的是...

    poj2775.rar_poj_poj 27_poj27_poj2775

    标签"poj poj_27 poj27 poj2775"进一步确认了这是一道关于POJ平台的编程挑战,其中"poj_27"可能是表示第27类问题或者某种分类,而"poj27"可能是对"poj2775"的简写。 压缩文件中的"www.pudn.com.txt"可能是一个链接...

    poj_2682(3).rar_C++ 数组扩充_poj 26_poj 2682_poj26

    标题中的"poj_2682(3).rar"是一个指向编程竞赛问题的引用,通常这类问题在网站如POJ(Programming Online Judge)上出现,供程序员解决并提交代码进行测试。这个问题的编号是2682,可能涉及到特定的数据结构或算法...

    pku1151.rar_Atlantis_pku 11_poj Atlant_poj Atlantis_poj11

    标题中的“pku1151.rar_Atlantis_pku 11_poj Atlant_poj Atlantis_poj11”似乎是指北京大学(Peking University, PKU)编程竞赛中的一道题目,编号为1151,与“Atlantis”这个主题相关。这道题目在多个平台上也被提及...

    poj2488.rar_poj24_poj2488_方向模板法

    标题中的“poj2488.rar_poj24_poj2488_方向模板法”指的是一个解决编程竞赛问题POJ2488的压缩文件,其中可能包含了解决该问题的代码示例。POJ是Programming Online Judge的缩写,是一个在线的编程竞赛平台,参与者...

    1010_stamps.zip_1010_POJ 1010_poj_poj stamps_poj10

    《POJ 1010 Stamps:解题思路与陷阱分析》 POJ 1010,也被称为“邮票问题”,是编程竞赛中的一道经典题目,旨在考察参赛者的动态规划和数学思维能力。这个题目在编程爱好者中具有较高的知名度,因为它涉及到有趣的...

    poj3601.rar_POJ3601_poj 36_visual c

    【标题】"POJ3601.rar" 是一个压缩包文件,主要包含了对北京大学在线评测系统(Online Judge)上的一道题目——POJ 3601的解答和相关实验报告。"POJ 3601"是这道编程问题的编号,通常在编程竞赛或练习平台中,每个...

    poj1038--Bugs.rar_Bugs_poj 1038 _poj10_poj1038

    标题中的“poj1038--Bugs.rar”是一个关于解决编程竞赛问题的压缩文件,其中包含了对“Bugs”问题的解答。POJ(Problemset Online Judge)是一个在线编程竞赛平台,它提供了一系列的问题供参赛者解决,旨在锻炼和...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    POJ3277.rar_3277 poj_poj3277_多个面积_线段树

    标题中的“POJ3277.rar_3277 poj_poj3277_多个面积_线段树”是指一个与编程竞赛相关的压缩文件,特别提到了POJ(Problemset Online Judge)的第3277号问题。POJ是一个著名的在线编程竞赛平台,参与者需要解决各种...

    ACM.zip_ACM_poj_poj3187_poj3669

    标题 "ACM.zip_ACM_poj_poj3187_poj3669" 提供的信息表明,这个压缩包包含的是与ACM(国际大学生程序设计竞赛)相关的编程题目解决方案,具体是POJ(Programming Online Judge)平台上的两道题目,编号分别为poj3187...

    POJ1753.rar_poj 1753_poj1753

    【标题】"POJ1753.rar_poj 1753_poj1753" 提供的资源是关于POJ1753编程挑战的解决方案,其中包括了完整的代码实现以及实验报告。POJ(Problem Online Judge)是中国大学常用的在线编程竞赛平台,它提供了一系列的...

    POJ14_MONI2.zip

    标题“POJ14_MONI2.zip”暗示这是一个与编程竞赛相关的压缩文件,很可能包含了某个特定问题的解决方案或代码示例。"POJ"通常指的是“Programming Online Judge”,这是一个在线编程竞赛平台,让参赛者解决各种算法...

    pku_poj_2187.rar_poj 2187_凸包问题

    标题中的“pku_poj_2187.rar_poj 2187_凸包问题”表明这是一个关于北京大学(Peking University, PKU)编程竞赛平台POJ上的第2187题,题目主要涉及凸包问题。描述中的“O(nlogn)凸包问题 poj2187”提示我们解决这个...

    string-problem(POJ).rar_POJ 19_poj

    标题中的"string-problem(POJ).rar_POJ 19_poj"表明这是一个与ACM编程竞赛相关的压缩包,特别关注的是字符串处理问题。在ACM编程竞赛中,字符串问题是一个常见的类别,通常涉及到字符串的查找、比较、操作、模式匹配...

    poj1990.rar_POJ 19_poj_poj19

    《POJ 1990:树状数组解题策略详解》 在编程竞赛的世界里,POJ(Programming Online Judge)是一个备受瞩目的在线评测系统,它提供了丰富的编程题目供参赛者挑战。其中,编号为1990的题目是一道涉及数据结构与算法...

    POJ3322.rar_poj33_www.3322.se.c

    标题中的"POJ3322.rar_poj33_www.3322.se.c"暗示这是一个关于编程竞赛的问题,POJ(Problem Online Judge)是著名的在线编程竞赛平台,而"3322"是该平台上问题的编号。这个问题可能是从www.3322.se.c这个网站上获取...

    欧拉回路题集

    - **题目描述**:这是一个单词接龙游戏的问题,可以通过构建图来解决,其中节点代表单词,边代表单词之间的转换关系。 - **解题思路**:构建一个无向图,然后判断是否存在欧拉回路。 - **数据结构**:使用邻接表...

    多种解题技巧POJ1035_Spelling Checker

    《多种解题技巧在POJ1035_Spelling Checker中的应用》 在编程竞赛领域,ACM(国际大学生程序设计竞赛)是一项备受瞩目的赛事,它要求参赛者在有限的时间内解决一系列复杂的算法问题。POJ(Problemset Online Judge...

    poj_1699.rar_1699_poj_poj1699

    【标题】"poj_1699.rar_1699_poj_poj1699" 提供的是一个关于POJ(编程在线判题系统)第1699题的解决方案,其中包含了该问题的代码实现和解题思路。POJ是一个流行的在线编程竞赛平台,它为参赛者提供了各种算法题目,...

Global site tag (gtag.js) - Google Analytics