ACM/ICPC 之 欧拉回路两道(POJ1300-POJ1386)

两道有关欧拉回路的例题



POJ1300-Door Man

//判定是否存在从某点到0点的欧拉回路
//Time:0Ms	Memory:116K
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

#define MAX 25
int st, n;
int door[MAX];

int main()
{
	char s[120];
	while (scanf("%s", s), strcmp(s, "ENDOFINPUT"))
	{
		memset(door, 0, sizeof(door));
		int doors = 0;
		scanf("%d%d", &st, &n);
		gets_s(s, 120);
		for (int i = 0; i < n; i++)
		{
			gets_s(s, 120);
			int num, k = 0;
			while (sscanf(s + k, "%d", &num) == 1)
			{
				doors++;
				door[num]++;
				door[i]++;
				while (s[k] == ‘ ‘)	k++;
				while (s[k] && s[k] != ‘ ‘) k++;
			}
		}
		gets_s(s, 120);
		int odd = 0;
		for (int i = 0; i < n; i++)
			odd += door[i] % 2 == 1;
		if (odd == 0 && st == 0)
			printf("YES %d\n", doors);	//无奇度节点
		else if (odd == 2 && st && door[st] % 2 && door[0] % 2)
			printf("YES %d\n", doors);	//两个奇度节点
		else printf("NO\n");
	}
	return 0;
}


POJ1386-Plays on Words

//判断能否使给定的词组前后接龙
//Time:344Ms	Memory:120K
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

#define MAX 28
#define MAXS 1005
#define MAXN 100005

int n;
char s[MAXS];
int in[MAX], out[MAX];
int fa[MAX];

int find(int x)
{
	return fa[x] < 0 ? x : find(fa[x]);
}

int Union(int r1, int r2)
{
	r1 = find(r1);	r2 = find(r2);
	if (r1 == r2)	return r1;
	int tmp = fa[r1] + fa[r2];
	if (fa[r1] > fa[r2])
	{
		fa[r1] = r2;
		fa[r2] = tmp;
		return r2;
	}
	else {
		fa[r2] = r1;
		fa[r1] = tmp;
		return r1;
	}
}

int main()
{
	//freopen("words.in", "r", stdin);
	int T;
	scanf("%d", &T);
	while (T--) {
		memset(in, 0, sizeof(in));
		memset(out, 0, sizeof(out));
		memset(fa, -1, sizeof(fa));

		int pa;
		scanf("%d", &n);
		while (n--) {
			scanf("%s", s);
			int i = s[strlen(s) - 1] - ‘a‘;
			int o = s[0] - ‘a‘;
			out[o]++;	in[i]++;
			pa = Union(i, o);
		}

		int odd = 0;
		bool connect = true;
		bool A = false, B = false;
		for (int i = 0; i < 26; i++)
		{
			if (!in[i] && !out[i]) continue;
			if (pa != find(i)) {
				connect = false;	break;
			}
			if (in[i] - out[i] != 0)
			{
				odd++;
				if (in[i] - out[i] == 1)	A = true;
				if (in[i] - out[i] == -1)	B = true;
			}
		}
		if (connect && ((odd == 2 && A && B) || odd == 0))
			printf("Ordering is possible.\n");
		else printf("The door cannot be opened.\n");
	}

	return 0;
}
时间: 2024-10-11 21:08:19

ACM/ICPC 之 欧拉回路两道(POJ1300-POJ1386)的相关文章

ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)

两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory:360K #include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> using namespace std; #define

ACM/ICPC 之 两道dijkstra练习题(ZOJ1053(POJ1122)-ZOJ1053)

两道较为典型的单源最短路径问题,采用dijkstra解法 本来是四道练习题,后来发现后面两道用dijkstra来解的话总觉得有点冗余了,因此暂且分成三篇博客(本篇以及后两篇). ZOJ1053(POJ1122)-FDNY to the Rescue! 1 //POJ1122-ZOJ1053 2 //dijkstra-需要记录路径 3 //给出n个路口的邻接矩阵,求给定多个火警到失火点的时间及任一路径 4 //注意输入最后一行时,cin.getline需要两次,猜测需要接受邻接矩阵最后一行其他字符

【转】[email&#160;protected]&#183;ACM/ICPC 回忆录

转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC这项赛事是在大三上的算法课上张老师提到的,当时我们学校的组织参加这项活动才刚刚起步,我也没太在意,总觉得那是非常遥远的事,事实上当时我也从未相当如今我们能获得现在的成绩.真正踏入ACM/ICPC这个神奇的世界,不得不提到2004那一年我们学校的参赛队伍xmutank,正是听了pipo师兄的精彩演讲以

[转]浅谈ACM ICPC的题目风格和近几年题目的发展

斯坦福大学 王颖 ACM ICPC的比赛形式一般是五个小时八个题目,综合考察选手的数学能力.算法能力.coding能力和debug能力,还有团队配合能力.数学方面主要强调组合数学.图论和数论这三个方面的能力:而算法的覆盖范围很广,涉及了大部分经典的算法,和少量较前沿的算法.由于每道题目都需要通过所有的测试数据才能得分,并且需要精确解,这限制了Approximation algorithm在一些NP-hard的题目中的运用,从而使得搜索和剪枝策略对于NP-hard的题目非常重要. Final的题目

ACM/ICPC 之 数据结构-邻接表+DP+队列+拓扑排序(TshingHua OJ-旅行商TSP)

做这道题感觉异常激动,因为在下第一次接触拓扑排序啊= =,而且看了看解释,猛然发现此题可以用DP优化,然后一次A掉所有样例,整个人激动坏了,哇咔咔咔咔咔咔咔~ 咔咔~哎呀,笑岔了- -|| 旅行商(TSP) Description Shrek is a postman working in the mountain, whose routine work is sending mail to n villages. Unfortunately, road between villages is

《ACM/ICPC 算法训练教程》读书笔记一之数据结构(堆)

书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了集训队final的意见买的,感觉还是不错滴. 相对于其他ACM书籍来说,当然如书名所言,这是一本算法训练书,有着大量的算法实战题目和代码,尽管小编还是发现了些许错误= =,有部分注释的语序习惯也有点不太合我的胃口.实战题目较多是比较水的题,但也正因此才能帮助不少新手入门,个人认为还是一本不错的算法书,当然自学还是需要下不少

2014 ACM/ICPC Asia Regional Guangzhou Online Wang Xifeng&#39;s Little Plot HDU5024

一道好枚举+模拟题目.转换思维视角 这道题是我做的,规模不大N<=100,以为正常DFS搜索,于是傻乎乎的写了起来.各种条件限制模拟过程 但仔细一分析发现对每个点进行全部八个方向的遍历100X100X100^8 .100X100个点,每个点在走的时候8中选择,TLE 于是改为另一个角度: 以符合要求的点为拐弯点,朝两个垂直的方向走,求出最远的距离.这样只要对每个点各个方向的长度知道,组合一下对应的就OK. 避免了每个点深搜. PS:搜索的时候x,y写反了,导致构图出现问题,以后用[dy][dx]

HDU 5014 Number Sequence(2014 ACM/ICPC Asia Regional Xi&#39;an Online) 题解

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5014 Number Sequence Problem Description There is a special number sequence which has n+1 integers. For each number in sequence, we have two rules: ● ai ∈ [0,n] ● ai ≠ aj( i ≠ j ) For sequence a and sequ

ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L

这套题是我上周日, 就是前天打得一场组队赛, 题目不太好找 题目链接:http://codeforces.com/gym/100861 在virtual judge 上也可以提交哦! A ACM ICPC Rules: 题目大意: 有很多所高校参加预选赛, 并在预选赛取得了排名, 但是对于每所学校, 除了MSU有4个名额之外其他大学只有两个名额( 也就是说, 只有每个大学的前2名进决赛(MSU前四名)&& 最多有10个队伍进入决赛), 高中队伍不能进入决赛. 给出预选赛的排名, 输出可以进