http://acm.nyist.net/JudgeOnline/problem.php?pid=42题目链接

  1. #include <cstdio>
  2. #include <cstring>
  3. #define CLR(arr) memset(arr,0,sizeof(arr))
  4. #define P 1001
  5. int G[P],fa[P];
  6. int find(int x){return x==fa[x]?x:x=find(fa[x]);}
  7. int main()
  8. {
  9.     int n,a,b,f,p,q;
  10.     scanf("%d",&n);
  11.     while(n--){
  12.         f=1;
  13.         scanf("%d%d",&p,&q);
  14.         for(int i=1;i<=p;i++)fa[i]=i;
  15.         while(q--){
  16.             scanf("%d%d",&a,&b);
  17.             G[a]++;//读取出入度
  18.             G[b]++;
  19.             fa[a]=find(b);
  20.         }
  21.         fa[a]=find(a);
  22.         for(int i=1;i<=p;i++)if((fa[i]=find(i))!=fa[a]){//判断各点是否在同一集合中
  23.             f=0;
  24.             break;
  25.         }
  26.         int sum=0;
  27.         if(f)//若已判断图为不连通,则不判断出入度
  28.         for(int i=1;i<=p;i++)if(G[i]%2){//判断出入度和是否为奇数
  29.             sum++;
  30.             if(sum>2){//出入度和为奇数,则不可能为欧拉道路
  31.                 f=0;
  32.                 break;
  33.             }
  34.         }
  35.         puts(f?"Yes\n":"No\n");
  36.         CLR(G);
  37.     }
  38.     return 0;
  39. }

一笔画,儿时经常玩的游戏,后来才知道,那叫欧拉道路,这题本质就是对欧拉道路的判断,根据已有定理,可形成欧拉道路的图中任意点的出入度和为奇数的个数不可以超过2个,因为有出必有入,这一点很容易编程实现,但上面的定理是基于图连通的情况下,因此我们还需要判断图的连通性,因为不想无脑dfs或bfs,于是上网查找更高效的图连通性判断算法,发现有所谓的传递闭包,想起白书里有,就翻了一天书,发作了两天鼻炎,最后发现这种方法是基于floyd算法实现的,时间复杂度是O(n3),还是不满意,就想用并查集实现,发现果然可行,但用了整整4ms,排行最高的只用了0ms,我想知道用 了什么方法,结果也是利用了并查集,而且方法更聪明(改到极致。。),这里也贴一下。(这算不算侵权。。。),并查集真是我见过最好用的数据结构,简单,代码少,应用性强。

  1. #include<stdio.h>
  2. #include<string.h>
  3. int father[1002];
  4. int Find(int x)
  5. {
  6.    if(father[x]==-1) return x;
  7.    return father[x]=Find(father[x]);
  8. }
  9. int main()
  10. {
  11.    int n,m,T,i,in[1002],a,b,sum,f;
  12.    scanf("%d",&T);
  13.    while(T--)
  14.    {
  15.       memset(in,0,sizeof(in));
  16.       memset(father,-1,sizeof(father));
  17.       scanf("%d%d",&n,&m);
  18.       for(i=0,sum=0;i<m;i++)
  19.       {
  20.          scanf("%d%d",&a,&b);
  21.          ++in[a]; ++in[b];
  22.          a=Find(a); b=Find(b);
  23.          if(a!=b) { father[a]=b; sum++; }
  24.       }
  25.       if(sum<n-1) { printf("No\n"); continue; }
  26.       for(i=1,f=0;i<=n;i++)
  27.          if(in[i]%2) { f++; if(f>2) break; }
  28.       if(f==0||f==2) printf("Yes\n");
  29.       else printf("No\n");
  30.    }
  31. }

Nyoj42 一笔画问题 (欧拉道路)的更多相关文章

  1. 6-14 Inspector s Dilemma uva12118(欧拉道路)

    题意:给出一个国家城市个数n   所需走过道路个数e   每条道路长t   该国家任意两个城市之间都存在唯一道路长t     要求 :找一条最短的路遍历所有所需走过的路 一开始以为是图的匹配  但是好 ...

  2. UVA 10129 Play on Words(欧拉道路)

    题意:给你n个字符串,问你是否可以出现一条链,保证链中每个字符串的第一个元素与上一个字符串的最后一个元素相同,注意可能重复出现同一个字符串 题解:以每一个字符串第一个元素指向最后一个元素形成一个有向图 ...

  3. Uva 10129 - Play on Words 单词接龙 欧拉道路应用

    跟Uva 10054很像,不过这题的单词是不能反向的,所以是有向图,判断欧拉道路. 关于欧拉道路(from Titanium大神): 判断有向图是否有欧拉路 1.判断有向图的基图(即有向图转化为无向图 ...

  4. UVa 10129 Play On Words【欧拉道路 并查集 】

    题意:给出n个单词,问这n个单词能否首尾接龙,即能否构成欧拉道路 按照紫书上的思路:用并查集来做,取每一个单词的第一个字母,和最后一个字母进行并查集的操作 但这道题目是欧拉道路(下面摘自http:// ...

  5. POJ 2513 Colored Sticks(欧拉道路+字典树+并查集)

    http://poj.org/problem?id=2513 题意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 思路: 题目很明 ...

  6. UVA-10129 Play on Words (判断欧拉道路的存在性)

    题目大意:给出一系列单词,当某个单词的首字母和前一个单词的尾字母相同,则这两个单词能链接起来.给出一系列单词,问是否能够连起来. 题目分析:以单词的首尾字母为点,单词为边建立有向图,便是判断图中是否存 ...

  7. 【UVa】12118 Inspector's Dilemma(欧拉道路)

    题目 题目     分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, ...

  8. UVA 10441 - Catenyms(欧拉道路)

    UVA 10441 - Catenyms 题目链接 题意:给定一些单词,求拼接起来,字典序最小的,注意这里的字典序为一个个单词比过去,并非一个个字母 思路:欧拉回路.利用并查集判联通,然后欧拉道路判定 ...

  9. UVA10129———欧拉道路

    题目 输入n(n≤100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如 acm,malform,mouse).每个单词最多包含1000 ...

随机推荐

  1. SIAlertView

    SIAlertView是AlertView的替代产品 的效果比较多 . 使用实例: SIAlertView *alertView = [[SIAlertView alloc] initWithTitl ...

  2. Windows store app Settings 的 应用 ( viewmodel + windows.storage)

    1.在首页 加入 一个元素(加下滑线的).此元素绑定了两个属性 <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  3. iOS开发 AFNetworking 3.0使用遇到的问题

    前段时间写了一个iOS开发之AFNetworking 3.0.4使用这篇文章,是基本的用法,昨天在使用的时候又出现了几个问题,特地俩记录下,希望能帮到大家! 问题一 我是做一个获取手机验证码的功能,进 ...

  4. 触发UIButton长按事件

    UIButton *aBtn=[UIButton buttonWithType:UIButtonTypeCustom]; [aBtn setFrame:CGRectMake(40, 100, 60,  ...

  5. ExtJs Ext.panel.Panel和Ext.container.Viewport布局问题

    Ext.container.Viewport Ext.panel.Panel Viewport 它的布局会占用整个 body,也应该是这样,它会随着浏览器的高度和宽度的变化而变化. Panel 布局时 ...

  6. PHP漏洞全解(七)-Session劫持

    本文主要介绍针对PHP网站Session劫持.session劫持是一种比较复杂的攻击方法.大部分互联网上的电脑多存在被攻击的危险.这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持可能. ...

  7. 在Python中调用C++,使用SWIG

    http://www.coder4.com/archives/2141 SWIG:Simplified Wrapper and Interface Generator,顾名思义,就是将C/C++包装为 ...

  8. c#中virtual, abstract和override的区别和用法

    virtual是把一个方法声明为虚方法,使派生类可重写此方法,一般建立的方法是不能够重写的,譬如类A中有个方法protected void method(){ 原代码....;}类B继承自类A,类B能 ...

  9. java this 隐式参数

    第37级 this 是隐式参数, 类的方法调用时,会系统自动传递一个this的参数给方法.(这个参数是隐式传递的) 所以在方法里可以使用this这个参数. this在方法中表示对象. this(参数列 ...

  10. 匿名函数和Lambda表达式

    这个题目有点牵强,真不知道如何取一个比较中意的名称,写技术博客,我很少拘泥小节,但是注重细节,如果细节都出现问题了,那么这个博文也就失去了价值. 其实应该从委托说起,委托是C#中的一个重要的内容,记得 ...