Uvaoj10054 - The Necklace

/*
    题意:打印欧拉回路!
    思路:开始时不明白,dfs为什么是后序遍历?
    因为欧拉回路本身是一条回路,那么我们在dfs时,可能存在提前找到回路,这条回路可能不是欧拉回路,
    因为没有遍历完成所有的边!如果写成前序遍历的话,存储起来的路径就不是一条完整的路径了!它有可能
    是多条回路组成的!答案就是错误 的!如果是后序遍历的话,当dfs是遇到了回路,那么就退出当前栈的搜索!
    去寻找其他的路径!最终得到的只有一条回路路径!-->欧拉回路~!
*/
#include<iostream>
#include<cstring>
#define M 55
#define Max 0x3f3f3f3f
using namespace std;

int cnt[M][M];
int deg[M];
int map[M][M];
int x;

struct Point{
   int x, y;
   Point(){}

   Point(int x, int y){
      this->x=x;
      this->y=y;
   }
}; 

Point p[1005];
int top;

void dfs(int u){
   if(!deg[u]) return;
   for(int i=1; i<=50; ++i)
     if(map[u][i] && cnt[u][i]){
         --cnt[u][i];
         --cnt[i][u];
         --deg[u];
         --deg[i];
         dfs(i);
         p[++top]=Point(u, i);
     }
}

int main(){
   int t, n, k=0;
   cin>>t;
   while(t--){
      cin>>n;
      x=Max;
      memset(cnt, 0, sizeof(cnt));
      memset(map, 0, sizeof(map));
      memset(deg, 0, sizeof(deg));
      for(int i=1; i<=n; ++i){
          int u, v;
          cin>>u>>v;
          deg[u]++;
          deg[v]++;
          map[u][v]=1;
          map[v][u]=1;
          cnt[u][v]++;
          cnt[v][u]++;
          if(x>u) x=u;
          if(x>v) x=v;
      }
      int ok=0;
      for(int i=1; i<=50; ++i)
         if(deg[i]%2!=0){
            ok=1;
            break;
         }
      cout<<"Case #"<<++k<<endl;
      if(ok){
         cout<<"some beads may be lost"<<endl;
         if(t) cout<<endl;
         continue;
      }
      top=0;
      dfs(x);
      if(top==n){
         for(top; top>=1; --top)
            cout<<p[top].x<<" "<<p[top].y<<endl;
      }
      else cout<<"some beads may be lost"<<endl;
      if(t) cout<<endl;
   }
   return 0;
}
时间: 2024-11-10 00:34:57

Uvaoj10054 - The Necklace的相关文章

UVa 10054:The Necklace, 欧拉回路+打印路径

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=995 题目类型: 欧拉回路 题目: My little sister had a beautiful necklace made of colorful beads. Two successive beads in the necklace sha

uva 10054 - The Necklace

点击打开链接uva 10054 思路: 欧拉回路 分析: 1 对于一个无向图来说如果这个图是一个欧拉图,那么必须满足该图是连通的并且每个点的度数都是偶数 2 题目给定n条边的无向图问我们是否是一个欧拉图,是的话输出欧拉图的一条路径 3 首先我们先判断是否所有点的度数都是偶数,然后我们去判断当前图是否是只有一个连通分支,那么这个利用并查集即可 4 如果都满足的话直接去搜索并且输出路径即可 代码: #include<stack> #include<cstdio> #include<

UVa 10596:Morning Walk, 赤裸裸的欧拉回路

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=1537 题目类型: 欧拉回路, 并查集, dfs 题目: Kamal is a Motashota guy. He has got a new job in Chittagong. So, he has moved to Chittagong fr

面向机器学习的自然语言标注.

面向机器学习的自然语言标注 James Pustejovsky & Amber Stubbs 著 邱立坤 金澎 王萌 译 图书在版编目(CIP)数据 面向机器学习的自然语言标注 / (美) 詹姆斯·普斯特若夫斯基(James Pustejovsky),安伯·斯塔布斯(Amber Stubbs)著:邱立坤,金澎,王萌译. -北京:机械工业出版社, 2017.1 (O'Reilly精品图书系列) 书名原文:Natural Language Annotation for Machine Learnin

面向机器学习的自然语言标注1.2 语料库语言学简史

1.2 语料库语言学简史 20世纪中叶,语言学实际上主要作为一种描述手段,用来研究语言中的结构属性和语言之间的类型差异.这使得构成语言表达的不同信息成分的描写模型相当复杂.在其他社会科学领域中,收集和分析数据一直来自统计学的计量技术.20世纪40年代,语言学家(如Bloomfield)开始思考语言可以用概率和行为主义术语来解释.经验和统计方法在20世纪50年代开始流行,同时香农(Shannon)的信息论给语言分析提供了可靠的量化方法,可以对语言结构进行量化建模. 不幸的是,语言分析的统计和量化方

解析jQuery的三种bind/One/Live事件绑定使用方法_jquery

jQuery是 一款优秀的JavaScript框架,在旧版里主要用bind()方法,在新版里又多了两种One(),Live(),下面介绍这几种方法的使用: 1. bind/Unbind在jquery的事件模型中,有两个基本的事件绑 定函数,bind与unbind,这两个函数的含义就是匹配页面元素进行相关事件的处理.比如我们在JS中经常使用到的 onfocus,onblur,onmouseover,onmousedown等事件都可以作为bind的参数进行传递. $("#id").bind

传说中的100句英语可以帮你背7000单词_经典网摘

1. Typical of the grassland dwellers of the continent is the American antelope, or pronghorn.  1.美洲羚羊,或称叉角羚,是该大陆典型的草原动物. 2. Of the millions who saw Haley's comet in 1986, how many people will live long enough to see it return in the twenty-first cent