UVA 10054 (欧拉回路) The Necklace

题目:这里

题意:有一种由彩色珠子连接而成的项链,每个珠子两半由不同颜色(由1到50的数字表示颜色)组成,相邻的两个珠子在接触的地方颜色相同,现在有一些零碎的珠子,确认它是否能

复原成完整的项链。

把每种颜色看成一个结点,每个珠子的两半连成一条有向边,就成了判断一个欧拉回路了,而输出回路路线可以用dfs,逆序输出,因为顺序输出的时候,由于可能会有一个结点上多

条边的情况,dfs的时候可能一开始会找到错误的路线再回溯回去,顺序输出就把这段错误的路线也输出了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7
 8 const int M = 1e3 + 10;
 9 int cas,head[M*4],father[60],du[60];
10 int vis[60][60];
11
12 struct Edge{
13    int next,to;
14 }edge[M*4];
15
16 int findest(int x)
17 {
18     if (x==father[x]) return x;
19     father[x]=findest(father[x]);
20     return father[x];
21 }
22
23 void add(int v,int u)
24 {
25     edge[++cas].next=head[v];
26     edge[cas].to=u;
27     head[v]=cas;
28 }
29
30 void euler(int u)
31 {
32     for (int i=head[u] ; i ; i=edge[i].next){
33         int v=edge[i].to;
34         if (!vis[u][v]) continue;
35         vis[u][v]--;vis[v][u]--;
36         euler(edge[i].to);
37         printf("%d %d\n",v,u);
38     }
39 }
40
41 int main()
42 {
43     int t,tem=0;
44     scanf("%d",&t);
45     int e=t;
46     while (t--)
47     {
48         int n,w;cas=0;
49         scanf("%d",&n);
50         memset(du,0,sizeof(du));
51         memset(vis,0,sizeof(vis));
52         memset(head,0,sizeof(head));
53         for (int i=1 ; i<=50 ; i++) father[i]=i;
54         for (int i=1 ; i<=n ; i++) {
55             int l,r;
56             scanf("%d%d",&l,&r);
57             if (i==1) w=l;
58             du[l]++;du[r]++;
59             add(l,r);
60             add(r,l);
61             vis[l][r]++;vis[r][l]++;
62             int x=findest(l),y=findest(r);
63             if (x!=y) father[x]=y;
64         }
65         bool flag=false;
66         int x=findest(w);
67         for (int i=1 ; i<=50 ; i++){
68             if (du[i]==0) continue;
69             if (du[i]%2!=0) flag=true;
70             if (findest(i)!=x) flag=true;
71             if (flag) break;
72         }
73         cas=0;
74         if (tem!=0) printf("\n");
75         printf("Case #%d\n",++tem);
76         if (flag) puts("some beads may be lost");
77         else  euler(w);
78     }
79     return 0;
80 }
时间: 2024-10-09 13:20:23

UVA 10054 (欧拉回路) The Necklace的相关文章

UVA - 10054 - The Necklace (欧拉回路!!)

UVA - 10054 The Necklace Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description  Problem D: The Necklace  My little sister had a beautiful necklace made of colorful beads. Two successive beads in the neckl

The Necklace UVA - 10054 (无向图的欧拉回路)

The Necklace UVA - 10054 题意:每个珠子有两个颜色,给n个珠子,问能不能连成一个项链,使得项链相邻的珠子颜色相同. 把颜色看做点,珠子内部连一条边,无向图求欧拉回路. 这里我用的并查集. 输出路径就dfs就行了 1 #include <bits/stdc++.h> 2 using namespace std; 3 int g[55][55]; 4 int f[55]; 5 int deg[55]; 6 int n; 7 8 int gf(int x) 9 { 10 re

uva 10054 The Necklace 欧拉回路

// uva 10054 The Necklace 欧拉回路 // 以颜色为节点,两种颜色互相连着有向边,然后跑一边欧拉回路就ok了 // 这题套了余老师模板书上的欧拉回路,然后就过了 // // 通过这题我了解到了,欧拉回路的基本思想 // 哎,继续练吧... #include <algorithm> #include <bitset> #include <cassert> #include <cctype> #include <cfloat>

UVA 10054 - The Necklace(欧拉回路)

题目链接:点击打开链接 题意:n个珠子,每个珠子的两半由不同的颜色组成. 只有相同的颜色才能接在一起, 问能否组成一个一个项链. 思路:如果将一个珠子看成是一条连接两个顶点的无向边,那么本题就变成了求无向图是否存在欧拉回路.  对于无向图, 如果所有点的度数都是偶数并且图是联通的, 那么就存在欧拉回路.   那么从任意一个点开始走都将走完所有道路并回到起点. 细节参见代码: #include<cstdio> #include<cstring> #include<algorit

UVA 10054 The Necklace (无向图的欧拉回路)

题意: 妹妹有一条项链,这条项链由许多珠子串在一起组成,珠子是彩色的,两个连续的珠子的交汇点颜色相同,也就是对于相邻的两个珠子来说,前一个珠子的末端颜色和后一个珠子的首端颜色相同.有一天,项链断了,珠子洒落了一地,到处都是,妹妹使出浑身解数把地板上能看到的珠子(5-1000)都捡了起来,但是不确定是否收集齐了.给你他妹妹收集的珠子的两端的颜色编号(1 - 50),让你判断是否收集齐了. 思路: 把颜色看成点,把一个珠子看成一个无向边,则问题有解,当且仅当图中存在欧拉回路.于是先判断由题意构建出来

The Necklace UVA 10054 (无向图的欧拉回路,求证Flury算法)

说说:题目的意思本质上就是给你N条无向边,若存在欧拉回路,则将其生成.无向图的欧拉回路的判断非常容易,只要判断是否每个节点都是偶数度即可.但是,对欧拉回路的生成,也就是Fleury算法,貌似有点问题.我自己在这个地方也纠结了好久.下面就来讲讲Fleury算法. 开始我觉得,就是个非常简单的深度优先搜索的问题,直接从任意一个节点,然后不断DFS即可.所以就有了如下的代码: for(i=1;i<MAX;i++) if(map[m][i]>0){ map[m][i]--; map[i][m]--;

UVa 10054 (打印欧拉回路) The Necklace

将每个颜色看成一个顶点,对于每个珠子在两个颜色之间连一条无向边,然后求欧拉回路. 1 #include <cstdio> 2 #include <cstring> 3 4 const int maxn = 50 + 5; 5 int G[maxn][maxn], deg[maxn]; 6 7 void Euler(int u) 8 { 9 for(int v = 1; v <= 50; v++) if(G[u][v]) 10 { 11 G[u][v]--; G[v][u]--

UVa 10054 The Necklace【欧拉回路】

题意:给出n个珠子,珠子颜色分为两半,分别用1到50之间的数字表示, 现在给出n个珠子分别的颜色,问是否能够串成一个环.即为首尾相连,成为一个回路 判断是否构成一个环,即判断是否为欧拉回路,只需要判断度数是不是偶数就可以了 (这道题目给出的珠子是在一个连通块上的,所以不用考虑连通) 然后输出结果要逆序输出,见这一篇,非常的详细 http://www.cnblogs.com/scau20110726/archive/2012/11/09/2762371.html 1 #include<iostre

【欧拉回路】UVA - 10054 The Necklace

题目大意: 一个环被切割成了n个小块,每个小块有头尾两个关键字,表示颜色. 目标是判断给出的n个小块能否重构成环,能则输出一种可行解(按重构次序输出n个色块的头尾颜色).反之输出"some beads may be lost". 解题思路: 一开始想的曼哈顿回路,WA了.后来依靠别人的智慧,知道正解是欧拉回路. 在知道这道题是欧拉回路的情况下就变得很简单了,就是一道模板题--每种颜色看成一个点,每个小块代表两点之间连接的边,如果存在欧拉回路就有可行解. 不存在欧拉回路有两种情况:1.图