UVa 10054 项链

题意:

思路:

Code:

#include<stdio.h>
#include<string.h>

bool solve();
void dfs(int n);

int graph[51][51];
int du[51];
int path[1010*2];
int len;

int main()
{
  //freopen("10054.in","r",stdin);
  //freopen("10054.out","w",stdout);
  int t;
  scanf("%d",&t);
  int num=0;
  while(t-->0)
  {
    num++;
    memset(graph,0,sizeof(graph));
    memset(du,0,sizeof(du));
    len=0;
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;++i)
    {
      int a,b;
      scanf("%d%d",&a,&b);
      du[a]++;
      du[b]++;
      graph[a][b]++;//增加一条无向边
      //graph[b][a]=graph[a][b];
      graph[b][a]++;
    }
    if(num!=1) printf("\n");
    printf("Case #%d\n",num);
    int len=0;
    if(solve()==false) printf("some beads may be lost\n");
  }
  return 0;
}

bool solve()
{
  //判定顶点度数
  for(int i=1;i<=50;++i)
  {
    if(du[i]%2==0) continue;
    else return false;
  }//printf("ok\n");
  //判定连通性
  int cnt=0;//连通块个数
  for(int i=1;i<=50;i++)
  {
    if(du[i])//存在该颜色
    {
      cnt++; dfs(i);
    }
  }
  if(cnt>1) return false;
  //print
  //printf("len:%d\n",len);
  for(int i=0;i<len-1;i=i+2)
  {
    printf("%d %d\n",path[i],path[i+1]);
  }
  //printf("%d %d\n",path[len-1],path[0]);
  return true;
}

void dfs(int n)
{
  for(int i=1;i<=50;i++)
  {
    if(graph[n][i])
    {
      graph[n][i]--;
      //graph[i][n]=graph[n][i];
      graph[i][n]--;
      du[n]--;
      du[i]--;
      //path[len++]=n;
      dfs(i);
      path[len++]=i;
      path[len++]=n;
    }
  }
}
时间: 2024-10-24 05:52:03

UVa 10054 项链的相关文章

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 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

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),让你判断是否收集齐了. 思路: 把颜色看成点,把一个珠子看成一个无向边,则问题有解,当且仅当图中存在欧拉回路.于是先判断由题意构建出来

UVA 10054 The Necklace

题意: 项链散了  每个珠子前端后端分别有颜色  在项链中  相邻的珠子的相邻的那一端颜色相同  问  找到的珠子能不能重新串起一根项链 思路: 比较经典的欧拉回路题  Fleury算法解决问题 代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define M 60 int n,ans,top,m,t,T; int Edge[M][M],path[M*M],

UVA 10054 (欧拉回路) The Necklace

题目:这里 题意:有一种由彩色珠子连接而成的项链,每个珠子两半由不同颜色(由1到50的数字表示颜色)组成,相邻的两个珠子在接触的地方颜色相同,现在有一些零碎的珠子,确认它是否能 复原成完整的项链. 把每种颜色看成一个结点,每个珠子的两半连成一条有向边,就成了判断一个欧拉回路了,而输出回路路线可以用dfs,逆序输出,因为顺序输出的时候,由于可能会有一个结点上多 条边的情况,dfs的时候可能一开始会找到错误的路线再回溯回去,顺序输出就把这段错误的路线也输出了. 1 #include<cstdio>

Uva(10129)+Uva(10054)

这两道题都是和欧拉图的判定有关,一个是有向图,一个是无向图的欧拉图的判定还有一个是有向图= = 先看10129...我们把单词的首字母看做是入度,最后一个字符看做是初度,那么这道题就变成图中是否存在欧拉回路.判断有向图的条件是该图是连通图和最多最有两个点的出度不等于入度,其实那两个点就是起点和终点,而且必须是其中一个点的入度比出度恰好大1(作为终点),另一个点的出度比它的入度恰好大1(作为起点) 连通图的话我们用并查集来判断,如果该图是连通图的话,那么他们共用祖先= = #include<std

UVA 10054(DFS_G题)解题报告

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=995 ------------------------------------------------------------------------------------------------------------------------------------------