UVa 10054 : The Necklace 【欧拉回路】

UVa 10054 : The Necklace 【欧拉回路】

大家好,又见面了,我是全栈君。

题目链接

题目大意:我的妹妹有一串由各种颜色组成的项链。 项链中两个连续珠子的接头处共享同一个颜色。 如上图, 第一个珠子是green+red, 那么接这个珠子的必须以red开头,如图的red+white.
噢!天啊! 一天, 项链项链被扯断了,珠子掉落了一地。我的妹妹竭尽全力的把珠子一个个捡起来, 但是她不确定是否全部捡回来了。 现在,她叫我帮忙。 
她想知道是否可能把这些珠子全部连接起来, 连接的方法和项链原来的方法一样。
请帮我写一个程序解决这个问题。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=60;

int n;
int T,kase=0;
int p[N];
int Find(int x)
{
    if(p[x]==-1) return x;
    return x==p[x]? x:p[x]=Find(p[x]);
}
void Union(int x,int y)
{
    x=Find(x),y=Find(y);
    p[x]=y;
}

int num[N];
int G[N][N];

void Traverse(int u)
{
    for(int v=1;v<=50;v++)
        if(G[u][v]>0)
        {
            G[u][v]--,G[v][u]--;
            Traverse(v);
            printf("%d %d\n",v,u);    //不可以顺序打印 
        }
}

void solve()
{
    if(kase>0) puts("");
    printf("Case #%d\n",++kase);
    int pp=-1;
    for(int i=1;i<=50;i++)
    {
        if(num[i]==0) continue;
        if(num[i]&1)     //存在奇度数结点 
        {
            puts("some beads may be lost");
            return ;
        }
        if(pp==-1)
        {
            pp=Find(i);
            continue;
        }
        if(pp!=Find(i))    //不联通 
        {
            puts("some beads may be lost");
            return ;
        }
    }
    Traverse(pp);
}

void init()
{
    memset(p,-1,sizeof(p));
    memset(num,0,sizeof(num));
    memset(G,0,sizeof(G));
}

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        init();
        for(int i=0;i<n;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            num[u]++,num[v]++;
            G[u][v]++,G[v][u]++;    //无向图 
            Union(u,v);
        }
        solve();
    }
}

 

转载于:https://www.cnblogs.com/Just–Do–It/p/7448932.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108202.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • f stream_fstream

    f stream_fstreamofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:1、插入器(  向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout2、析取器(>>)  从流中输入数据

    2022年9月15日
    5
  • 二维数组赋值 java_java二维数组的赋值方法「建议收藏」

    二维数组赋值 java_java二维数组的赋值方法「建议收藏」在java数组中,我们想要知道其长度,可以通过赋值的方法来实现。在正式开始对数组赋值前,我们要明确其中的下标问题。在准备步骤上,先找到高维的位置,再确定低纬的下标,就可以进行相关的赋值操作了。下面就具体的二维数组赋值,我们先简单分析赋值的概念,然后带来具体的赋值实例。1.赋值概念使用双下标访问二维数组中的元素:第一个下标代表:行号(高维下标)。第二个下标代表:列号(低维下标)。2.赋值实例(1)赋…

    2022年5月6日
    159
  • matplotlib常用函数介绍及使用

    matplotlib常用函数介绍及使用

    2022年2月20日
    53
  • 算法(一)时间复杂度「建议收藏」

    算法(一)时间复杂度「建议收藏」算法很重要,但是由于做移动开发并不经常用到,所以很多同学早就将算法打了个大礼包送还给了老师了,况且很多同学并没有学习过算法。这个系列就让对算法头疼的同学能快速的掌握基本的算法。过年放假阶段玩了会游戏NBA2K17的生涯模式,没有比赛的日子也都是训练,而且这些训练都是自发的,没有人逼你,从早上练到晚上,属性也不涨,但是如果日积月累,不训练和训练的人的属性值就会产生较大差距。这个突然让我意识到

    2022年5月15日
    41
  • 程序世界,平凡的我

    做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!昨天是2019年4月23日,这是一个什么日子呢? 如果我没有看日历的提醒,我其实也不忘记了这是什么日子。每一年的4月23日是世界读书日,世界读书日你读书了吗?昨天我是没有真正读书的,昨天下班比较晚,回到家吃饭洗漱完快十二点了,想着第二天还要上班,就睡觉了。今天刷CSDN看到征文活动: “征文|@程序员 你读过的书,…

    2022年2月28日
    39
  • HTML中div与span标签的区别(带图)

    HTML中div与span标签的区别(带图)

    2021年10月3日
    76

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号