两个欧拉路径的例题

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
int n,m,a,b;
int degree[1005];
int vis[1005]={0};
vector<int> vec[1005];

int get=0;
void dfs(int st)
{
    vis[st]=1;
    get++;
    for(int i=0;i<vec[st].size();i++)
    {
        int v=vec[st][i];
        if(!vis[v])
        {
            dfs(v);
        }
    }
}
int main()
{
    memset(degree,0,sizeof(degree));

    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        vec[a].push_back(b);
        vec[b].push_back(a);
        degree[a]++;
        degree[b]++;
    }
    int flag=1;
    dfs(1);
    if(get!=n) flag=0;
    for(int i=1;i<=n;i++)
    {
        if(degree[i]%2!=0)
        {
            flag=0;
            break;
        }
        if(degree[i]==0)
        {
            flag=0;
            break;
        }
    }
    if(flag) printf("1");
    else printf("0");
    return 0;
}

思路是把字母看成点,单词看成边。不知道该怎么判断连通性,看了别人用并查集进行判定

#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>

using namespace std;
int n,chu[200],ru[200],zifu[200],tot,fa[200];

int find(int x)
{
    if (x == fa[x])
        return x;
    return fa[x] = find(fa[x]);
}

bool check(int c)
{
    for (int i = 1; i <= tot; i++)
        if (zifu[i] == c)
            return true;
    return false;
}

int main()
{
    for (int i = ‘a‘;i <= ‘z‘; i++)
        fa[i] = i;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        char s[25];
        scanf("%s", s);
        int len = strlen(s);
        if (!check(s[0]))
        zifu[++tot] = s[0];
        if (!check(s[len - 1]))
        zifu[++tot] = s[len - 1];
        ru[s[len - 1]]++;
        chu[s[0]]++;
        int x = find(s[0]);
        int y = find(s[len - 1]);
        fa[x] = y;
    }
    if (n == 1)
        printf("Euler path");
    else
    {
        bool flag1 = 0;
        int ans = 0;
        for (int i = 1; i <= tot; i++)
        {
            if (find(zifu[i]) != fa[zifu[1]])
            {
                flag1 = 1; //不连通
                break;
            }
            int t = abs(chu[zifu[i]] - ru[zifu[i]]);
            if (t >= 2)
            {
                //不是欧拉路径
                flag1 = 1;
                break;
            }
            if (t == 1)
            {
                ans++;
            }
        }
        if (flag1)
            printf("impossible");
        else
            if (ans==0)
                printf("Euler loop");
            else
                if (ans == 2)
                    printf("Euler path");
                else
                    printf("impossible");
    }
    return 0;
}
时间: 2024-10-13 00:27:51

两个欧拉路径的例题的相关文章

穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753

下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A message from humans to extraterrestrial intelligence was sent through the Arecibo radio telescope in Puerto Rico on the afternoon of Saturday November 16

UPC 2170 D Equal Is Not Really Equal (欧拉路径)

题目链接:http://acm.upc.edu.cn/problem.php?id=2170 题意:给出一个字符串,比如ABACA,在这个串里,AB.BA.AC.CA各出现一次.若存在另外一个串,里面也AB.BA.AC.CA各出现一次.我们称ABACA是不唯一的.给出一个串,判断其是不是唯一. 思路:将字母看做顶点,将相邻的连有向边.那么题 目转化成这个图是不是存在两条欧拉路径.现在这个图至少有一条欧拉路径.设原串最后一个字母对应的节点为end.那么现在的图中若存在一个点u,对于这个 u至少有两

[关于最短路的一些小结]

以前感觉Dijkstra没jb用 今天做了几道题感觉到了一点用处 首先他是在处理密集的图的时候比Spfa会快一点 时间是O(Nlogn)好像 然后有一道题Spfa跑了一分钟Dijkstra 0.1s 忘了什么题 所以Dijksta还是有点用的 其实在这里只想讲一点Dijkstra小的优化而已 并没有打算讲太多东西 1.用堆优化 sb都会写不会看白书(巫泽俊写的) P102-P103 2.其实这个优化不知道Spfa可不可以用 好像也可以,像往常一样 先给道例题 bzoj2200 这道题有单向边 有

stl的集合set——安迪的第一个字典(摘)

set就是数学上的集合——每个元素最多只出现一次,和sort一样,自定义类型也可以构造set,但同样必须定义“小于”运算符 (ps:multiset是允许有重复数据的集合) set不支持随机访问,必须要使用迭代器去访问. begin() 返回指向第一个元素的迭代器clear() 清除所有元素count() 返回某个值元素的个数empty() 如果集合为空,返回true(真)end() 返回指向最后一个元素之后的迭代器,不是最后一个元素erase() 删除集合中的元素find() 返回一个指向被查

母函数细致讲解

母函数又称生成函数.定义是给出序列:a0,a1,a2,.......ak,......,那么函数G(x)=a0+a1*x+a2*x2+......ak*xk称为序列a0,a1,a2,.......ak,......的母函数(即生成函数). 例如:序列1,2,3.......n的生成函数为:G(x)=x+2x2+3x3+........nxn.点此链接:百度百科 特别的当序列为:1,1,1,1,.......1,这个生成函数为:G(x)=x+x2+x3+.......+xn=(1-xn)/(1-x

mount和自动挂载

Mount挂载详解 常见操作:  vfat文件系统类型 挂载U盘: #mount -t vfat /dev/sdb4 /USB -t:指定要访问的类型 挂载移动硬盘: #mount -t ntfs-3g /dev/sdb1 /USB 挂载镜像文件: #mount -t iso9660 rhel6u4.iso /cd-rom -o loop  # loop选项用来挂载镜像文件,如果只挂载光盘不用loop iso:虚拟光盘文件,刻光盘时候用 挂载光盘: #mount -t iso9660 /dev/

黑马程序员——Java中的面向对象

----android培训.java培训.期待与您交流! ---- 通过一段时间的学习,对于面向对象有了更深刻的了解,面向对象是将复杂的事情简单化,面向对象的思想更能全面详细的想到问题的关键,下面是对面向对象的一些总结: 面向对象:将功能封装进对象,强调具备了功能的对象 特点: 1:将复杂的事情简单化.                2:面向对象将以前的过程中的执行者,变成了指挥者.                3:面向对象这种思想是符合现在人们思考习惯的一种思想. 面向过程是执行者   , 

JavaScript预解释是一种毫无节操的机制

前言 JavaScript是一门解释型的语言 , 想要运行JavaScript代码需要两个阶段 编译阶段: 编译阶段就是我们常说的JavaScript预解释(预处理)阶段,在这个阶段JavaScript解释器将完成把JavaScript脚本代码转换到字节码 执行阶段: 在编译阶段JavaScript解释器借助执行环境把字节码生成机械码,并从上到下按顺序执行 本文就重点介绍预解释,框架图如下: 一.什么是预解释 预解释:JavaScript代码执行之前,浏览器首先会默认的把所有带var和funct

单调队列 单调栈

建议不了解STL的读者先了解几个基本的队列的STL.这也是单调队列和单调栈一般都会用到的. 单调队列:建立一个队列,使队列一直具有单调性(满足单调递增或者单调递减),时间复杂度O(N). 那么我们应该如何做到"使队列一直具有单调性"呢? 以单调递增为例,我们O(N)扫描整个序列,每扫描到一个元素: 1 如果该元素大于等于队列末尾元素,则直接入队; 2 而如果该元素小于已有队列的末尾元素,即不满足单调递增,则使队列中的末尾元素出队,直到该元素符合入队条件,然后入队. 如果只到这里,那么我