UVA 10129 Play on Words (欧拉通路)
本文链接:http://www.cnblogs.com/Ash-ly/p/5398627.html
题意:
输入N(N <= 100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如:acm,malform,mouse)。每个单词最多包含 1000 个小写字母。输入中可以有重复的单词。
思路:
把一个字母的两端开成节点,单词看成有向边,若问题有借,当且仅当图中存在欧拉通路。所有只需要判断由单词而构建的图是否存在欧拉通路,由于是有向边,所以利用有向图欧拉通路的判定就可以了。
判定条件
(1):底图是连通图
(2):可以有两个奇点,其中一个出度比入度大 1,另外一个入度比出度大1.
对于条件1,在这里用并查集判断了,条件2统计每个点的出度,入度,加以判断就行了.
代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std; const int maxV = ;
int m;
int pre[maxV + ];
int outdegree[maxV + ];
int indegree[maxV + ]; int Find(int x){return x == pre[x] ? x : pre[x] = Find(pre[x]); }//并查集的查找
void initPre(){ for(int i = ; i <= maxV; i++) pre[i] = i; }//初始化并查集的数组 int mix(int x, int y)//并查集的合并
{
int fx = Find(x), fy = Find(y);
if(fx != fy) pre[fx] = fy;
} bool isConnct()//判断图是否连通,即所有的点都在一个集合里面
{
int cnt = ;
for(int i = ; i <= maxV; i++)if( (outdegree[i] != || indegree[i] != ) && pre[i] == i) cnt++;
if(cnt == )return true;
return false;
} bool isEulur()//是否存在欧拉通路
{
int cnt = ;
int flag = ;
for(int i = ; i <= ; i++)
if((outdegree[i] != || indegree[i] != ) && (indegree[i] != outdegree[i]))//判断奇点,方法不唯一。
{
cnt++;
flag += (indegree[i] - outdegree[i]);
if(flag > || flag < -) return false;
}
if(cnt == || cnt == && flag == ) return true;
return false;
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &m);
initPre();
memset(indegree, , sizeof(indegree));
memset(outdegree, , sizeof(outdegree));
for(int i = ; i <= m; i++)
{
char word[ + ];
scanf("%s", word);
int u = word[] - 'a' + ;
int len = strlen(word);
int v = word[len - ] - 'a' + ;
mix(u, v);
++outdegree[u];
++indegree[v];
}
if(isEulur() && isConnct()) printf("Ordering is possible.\n");
else printf("The door cannot be opened.\n");
}
return ;
}
UVA 10129 Play on Words (欧拉通路)的更多相关文章
- ACM/ICPC 之 DFS求解欧拉通路路径(POJ2337)
判断是欧拉通路后,DFS简单剪枝求解字典序最小的欧拉通路路径 //Time:16Ms Memory:228K #include<iostream> #include<cstring& ...
- POJ 1300 欧拉通路&欧拉回路
系统的学习一遍图论!从这篇博客开始! 先介绍一些概念. 无向图: G为连通的无向图,称经过G的每条边一次并且仅一次的路径为欧拉通路. 如果欧拉通路是回路(起点和终点相同),则称此回路为欧拉回路. 具有 ...
- poj 2513 连接火柴 字典树+欧拉通路 好题
Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27134 Accepted: 7186 ...
- poj2513- Colored Sticks 字典树+欧拉通路判断
题目链接:http://poj.org/problem?id=2513 思路很容易想到就是判断欧拉通路 预处理时用字典树将每个单词和数字对应即可 刚开始在并查集处理的时候出错了 代码: #includ ...
- hdu1116有向图判断欧拉通路判断
Play on Words Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- Colored Sticks POJ - 2513 并查集+欧拉通路+字典树hash
题意:给出很多很多很多很多个棒子 左右各有颜色(给出的是单词) 相同颜色的可以接在一起,问是否存在一种 方法可以使得所以棒子连在一起 思路:就是一个判欧拉通路的题目,欧拉通路存在:没奇度顶点 或者 ...
- 欧拉回路&欧拉通路判断
欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉通路是否存在的方法 ...
- POJ2513Colored Sticks(欧拉通路)(字典树)(并查集)
Colored Sticks Time Limit: 5000MS Memory ...
- HDU 5883 F - The Best Path 欧拉通路 & 欧拉回路
给定一个图,要求选一个点作为起点,然后经过每条边一次,然后把访问过的点异或起来(访问一次就异或一次),然后求最大值. 首先为什么会有最大值这样的分类?就是因为你开始点选择不同,欧拉回路的结果不同,因为 ...
随机推荐
- iOS 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃
我的这个是MJRefresh,学习打.a包Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ...
- USACO Section2.3 Money Systems 解题报告 【icedream61】
money解题报告------------------------------------------------------------------------------------------- ...
- lnmp一键安装环境中nginx开启pathinfo
问题及原理可参考:http://www.laruence.com/2009/11/13/1138.html 如果是用lnmp脚本一键安装的开发环境,可以通过如下方式开户pathinfo: 1.注释ng ...
- Python 爬虫-豆瓣读书
import requests from bs4 import BeautifulSoup def parse_html(num): headers = { 'User-Agent': 'Mozill ...
- Python编码、流程控制、格式化输出
Python编码 初始编码: 电脑的传输,还有储存,实际上都是010101010 ASCII码: (American Standard Code for Information Interchange ...
- Python学习记录一
1.这个在unix类的操作系统才有意义.#!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器:#!/usr/bin/env python这种用 ...
- 孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成
孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天经过反复折腾,最终基本上算 ...
- 容器基础(二): 使用Namespace进行边界隔离
Linux Namespace 容器技术可以认为是一种沙盒(sandbox), 为了实现沙盒/容器/应用间的隔离,就需要一种技术来对容器界定边界,从而让容器不至于互相干扰.当前使用的技术就是Names ...
- css 外边距,内边距的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android动态添加和移除布局
package com.hyang.administrator.studentproject; import android.os.Bundle; import android.support.v7. ...