杭电ACM1116——Play on Words~~欧拉路径与欧拉回路

这一题,相比之前做的题目,增加了欧拉路径的求解。而且这一题是有向图。题目大概的意思就是成语接龙,能接起来就算可以打开门,因此要考虑两种,一种是回路,另外一种是一条路径。

第一次WR就是因为没有考虑回路这一个因素。

有向图中,欧拉回路与欧拉路径的求解方法:

1.欧拉回路:

首先当然是图连通,其次就是所以顶点的入度都等于出度。

2.欧拉路径:

首要的还是图连通,然后就是存在一个顶点的出度大入度1,存在一个顶点的入度大出度1,其他顶点的入度等于出度。

这些就不再证明。图的连通可以用DFS来判断或者并查集,个人喜欢并查集。

下面是AC的代码,有详细的注释:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int par[30], indegree[30], outdegree[30];    //par为并查集,indegree为入度,outdegree为出度
bool vis[30];                                //vis为该顶点出现过的标记
int finds(int x)                             //并查集的查找函数
{
	int r = x;
	while(r != par[r])
		r = par[r];
	int i = x, j;
	while(i != r)                            //路径压缩
	{
		j = par[i];
		par[i] = r;
		i = j;
	}
	return r;
}
void join(int x, int y)                      //并查集的合并函数
{
	int fx = finds(x);
	int fy = finds(y);
	if(fx != fy)
		par[fy] = fx;
}
int main()
{
	int t, n, i;
	char str[1005];
	scanf("%d", &t);
	while(t--)
	{
		memset(indegree, 0, sizeof(indegree));        //初始化各个数组
		memset(outdegree, 0, sizeof(outdegree));
		memset(vis, false, sizeof(vis));
		for(i = 0; i < 30; i++)                       //初始化并查集
			par[i] = i;
		scanf("%d", &n);
		while(n--)
		{
			scanf("%s", str);
			int len = strlen(str);
			join(str[0] - 'a', str[len - 1] - 'a');   //合并出现的顶点
			indegree[str[len - 1] - 'a']++;           //相应的入度+1
			outdegree[str[0] - 'a']++;                //相应的出度+1
			vis[str[0] - 'a'] = true;                 //标记该顶点出现过
			vis[str[len - 1] - 'a'] = true;
		}
		int flag = 0, tag = 0, a = 0, b = 0;          //flag来判图是否连通,tag为图中顶点入度不等于出度的个数
							<span style="white-space:pre">	</span>//a为入度大出度1的点的个数,b为出度大入度1的点的个数
		for(i = 0; i < 30; i++)                       //判连通
		{
			if(vis[i] && par[i] == i)
				flag++;
		}
		if(flag > 1)                                   //不连通,直接输出
		{
			printf("The door cannot be opened.\n");
		}
		else
		{
			for(i = 0; i < 30; i++)                    //查找tag,a, b 的个数
			{
				if(vis[i] && indegree[i] != outdegree[i])
				{
					tag++;
				}
				if(vis[i] && indegree[i] - outdegree[i] == 1)
					a++;
				if(vis[i] && outdegree[i] - indegree[i] == 1)
					b++;
			}
			if(tag == 0)                              //tag = 0,存在欧拉回路
				printf("Ordering is possible.\n");
			else if(a == b && a == 1 && tag == 2)     //a = 1 && b = 1 && tag = 2.存在欧拉路径
				printf("Ordering is possible.\n");
			else
				printf("The door cannot be opened.\n");
		}
	}
	return 0;
}
时间: 2024-12-14 20:58:34

杭电ACM1116——Play on Words~~欧拉路径与欧拉回路的相关文章

杭电 HDU 1164 Eddy&#39;s research I

Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7117    Accepted Submission(s): 4268 Problem Description Eddy's interest is very extensive, recently  he is interested in prime

hdu 1016 Prime Ring Problem DFS解法 纪念我在杭电的第一百题

Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 29577    Accepted Submission(s): 13188 Problem Description A ring is compose of n circles as shown in diagram. Put natural num

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

一个人的旅行 HDU杭电2066【dijkstra算法】

http://acm.hdu.edu.cn/showproblem.php?pid=2066 Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景--草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女--眼看寒假就快到了,这么一大段时间,可不

杭电1162--Eddy&#39;s picture(Prim()算法)

Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8070    Accepted Submission(s): 4084 Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to b

杭电1276--士兵队列训练问题

士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4605    Accepted Submission(s): 2148 Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行

杭电1272 并查集找环+判断连通

杭电1272 并查集找环+判断连通 E - E Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1272 Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B

杭电ACM Java实现样例

若使用Java求解杭电ACM,答案提交必须注意两点: 1.类名一定得是Main,否则服务器无法编译: 2.必须用while进行输入判断. 以1000题测试题为例,代码如下: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan=new Scanner(System.in); while(scan.hasNextInt()) { int a=scan.n

杭电 HDU 1038 Biker&#39;s Trip Odometer

Biker's Trip Odometer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4745    Accepted Submission(s): 3144 Problem Description Most bicycle speedometers work by using a Hall Effect sensor faste