10129 - Play on Words(欧拉道路<有向图>)

题目:10129 - Play on Words


题目大意:词语接龙。


解题思路:刚开始没想到欧拉道路,直接找,结果超时了。

这题满足要求的话就是把每个单词看做一条路,每条路连在一起走一遍就符合要求, 欧拉回路也是符合要求的。


满足欧拉道路:1,至多只有两个点的出度入度相差1。

   2, 这个有向图的无向图连通。(刚开始一直在想,如果有两条一样的路,这样怎么处理,后面发现只要每个点都可以访问到就说明连通了)


#include<stdio.h>
#include<string.h>

const int N = 26;
const int M = 1005;
int t, n;
int map[N][N], in[N], out[N], visit[N];
char word[M];

void dfs(int x, int &m) {
	
	m++;
	visit[x] = 1;
	for(int i = 0; i < N; i++)
		if(map[x][i] && !visit[i]) {
			dfs(i, m);
		}
}

int num_vertic() {

	int num = 0;
	for(int i = 0; i < N; i++)
		if(in[i] || out[i])
			num++;
	return num;
}

int get_first() {

	for(int i = 0; i < N; i++)
		if(in[i] == 0 && out[i]) {

			for(int j = 0; j < N; j++)
				if(map[i][j]) 
					return j;
		}
}

int main() {

	scanf("%d", &t);
	while(t--) {

		scanf("%d", &n);
		int i, e, f;
		memset(map, 0, sizeof(map));
		memset(in, 0, sizeof(in));
		memset(out, 0, sizeof(out));
		memset(visit, 0, sizeof(visit));

		for(i = 0; i < n; i++) {

			scanf("%s", word);
			 f = word[0] - 'a';
			 e = word[strlen(word) - 1] - 'a';
			in[e]++;
			out[f]++;
			map[f][e] = 1;
			map[e][f] = 1;
		}


		int ok = 0;
		for(i = 0; i < N; i++) {

			if(in[i] - out[i] == 1 || out[i] - in[i] == 1) 
				ok++;
			else if(in[i] != out[i]) {

				ok = -1;
				break;
			}
		}

		if(ok != 0 && ok != 2) 
			printf("The door cannot be opened.\n");
		else {

			if(ok == 2)
				e = get_first(); 
			ok = 0;
			dfs(e, ok);
			if(ok == num_vertic())
				printf("Ordering is possible.\n");
			else
				printf("The door cannot be opened.\n");				
		}
	}
	return 0;
}


你可能感兴趣的:(10129 - Play on Words(欧拉道路<有向图>))