UVA10054_The Necklace

很简单,求欧拉回路。并且输出。

只重点说一下要用栈来控制输出。

为啥,如图:

如果不用栈,那么1->2->3->1就回来了,接着又输出4->5,发现这根本连接不上去,所以如果用栈的话,就会保存一条完整的路径咯。

因为是无向图,只要满足每个点的度数都是偶数的话就一定存在合法的欧拉回路了。

召唤代码君:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

int a[51][51],n=50,d[51],m,T;

void dfs(int x)
{
    for (int i=1; i<=n; i++)
        if (a[x][i])
        {
            a[x][i]--,a[i][x]--;
            dfs(i);
            printf("%d %d\n",i,x);
        }
}

int main()
{
    int cas=0,U,V;
    scanf("%d",&T);
    while (T--)
    {
        memset(d,0,sizeof d);
        memset(a,0,sizeof a);
        scanf("%d",&m);
        while (m--)
        {
            scanf("%d%d",&U,&V);
            a[U][V]++,a[V][U]++;
            d[U]++,d[V]++;
        }
        bool ans=true;
        for (int i=1; i<=n; i++)
            if (d[i]&1) ans=false;
        if (cas) printf("\n");
        printf("Case #%d\n",++cas);
        if (!ans) printf("some beads may be lost\n");
            else dfs(U);
    }
    return 0;
}

  

UVA10054_The Necklace,布布扣,bubuko.com

时间: 2024-10-06 10:41:00

UVA10054_The Necklace的相关文章

Section1.1 -- Broken Necklace

Broken Necklace You have a necklace of N red, white, or blue beads (3<=N<=350) some of which are red, others blue, and others white, arranged at random. Here are two examples for n=29: 1 2 1 2 r b b r b r r b r b b b r r b r r r w r b r w w b b r r

HDU5730 Shell Necklace

Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 999    Accepted Submission(s): 434 Problem Description Perhaps the sea‘s definition of a shell is the pearl. However, in my view, a shell necklac

UVA 11054 The Necklace 转化成欧拉回路

题意比较简单,给你n个项链碎片,每个碎片的两半各有一种颜色,最后要把这n个碎片串成一个项链,要求就是相邻碎片必须是同种颜色挨着. 看了下碎片总共有1000个,颜色有50种,瞬间觉得普通方法是无法在可控时间内做出来的,因为碎片到底放哪里以及是正着放还是反着放都是不可控的. 这个时候数学建模就真的好重要了,如果我们能把颜色作为节点,一个碎片就表示两个节点连了一条路,那其实就是走了一遍欧拉回路,就意味着项链做成了. 太叼了,这个思想真心不错...LRJ书上的提示,否则我还真是想不到可以这样. 不过还有

洛谷 P1203 [USACO1.1]坏掉的项链Broken Necklace

P1203 [USACO1.1]坏掉的项链Broken Necklace 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A 中的项链可以用下面的字符串表示: brbrrrbbbrrrrrbrrbbrbbbbrrrrb 假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收

Uva10054 The Necklace

Uva10054 欧拉回路 题意:给n个珠子,每个珠子的两端的颜色不同.问能否组成一条项链,两颗相邻的珠子相邻的两端颜色相同. 思路:把颜色看做点.珠子看做边.每一个珠子在两种颜色之间连边.无向图中任意一点的度数都为偶数,则该图具有欧拉回路.然后通过euler函数来输出即可. /* ID: onlyazh1 LANG: C++ TASK: The Necklace */ #include<iostream> #include<cmath> #include<stack>

[数据生成器]UVA10054 The Necklace

应吴老师之邀,写了个数据生成器. 目前这个数据生成器可以保证生成的数据都是合法的,且效率也还不错.只是在建立普通连通图的时候zyy偷懒了,直接把所有点串起来从而保证图的连通.如果有大神有更好的方法请不吝指教,zyy不胜感谢~~ 下面是代码: 1 #include<cstdio> 2 #include<ctime> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #includ

[题解]UVA10054 The Necklace

链接:http://vjudge.net/problem/viewProblem.action?id=18806 描述:给出一堆珠子,每个珠子有两种颜色,有一端颜色相同的珠子可以串在一起,问是否可以把所有珠子串在一起,并求其中一种方案. 思路:欧拉回路 以颜色作为节点,以珠子作为边建图,无向图. 下面是我的实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespac

hdu 1817 Necklace of Beads(Polya定理)

题目链接:hdu 1817 Necklace of Beads 这题的弱化版:传送门 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 typedef long long ll; 5 6 int t,n,m,cas; 7 8 ll mypow(ll a,ll k){ 9 ll an=1; 10 while(k){ 11 if(k&1)an=an*a

SCU - 4441 Necklace(树状数组求最长上升子数列)

Necklace frog has \(n\) gems arranged in a cycle, whose beautifulness are \(a_1, a_2, \dots, a_n\). She would like to remove some gems to make them into a beautiful necklace without changing their relative order. Note that a beautiful necklace can be