Hiho : 欧拉路径

欧拉路径

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌。

主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过。

小Hi注意到在桥头有一张小纸片,于是控制主角捡起了这张纸片,只见上面写着:

将M块骨牌首尾相连放置于石桥的凹糟中,即可关闭火焰墙。切记骨牌需要数字相同才能连接。
——By 无名的冒险者

小Hi和小Ho打开了主角的道具栏,发现主角恰好拥有M快骨牌。

小Ho:也就是说要把所有骨牌都放在凹槽中才能关闭火焰墙,数字相同是什么意思?

小Hi:你看,每一块骨牌两端各有一个数字,大概是只有当数字相同时才可以相连放置,比如:

小Ho:原来如此,那么我们先看看能不能把所有的骨牌连接起来吧。

提示:Fleury算法求欧拉路径

输入

第1行:2个正整数,N,M。分别表示骨牌上出现的最大数字和骨牌数量。1≤N≤1,000,1≤M≤5,000

第2..M+1行:每行2个整数,u,v。第i+1行表示第i块骨牌两端的数字(u,v),1≤u,v≤N

输出

第1行:m+1个数字,表示骨牌首尾相连后的数字

比如骨牌连接的状态为(1,5)(5,3)(3,2)(2,4)(4,3),则输出"1 5 3 2 4 3"

你可以输出任意一组合法的解。

样例输入
5 5
3 5
3 2
4 2
3 4
5 1
样例输出
1 5 3 4 2 3
  1 import java.util.ArrayList;
  2 import java.util.Scanner;
  3
  4
  5 public class Main {
  6
  7        ArrayList result = new ArrayList();
  8         public static void main(String[] argv){
  9
 10             Scanner in = new Scanner(System.in);
 11             int m = in.nextInt();
 12             int n = in.nextInt();
 13             /*
 14              * 用可变长数组来代替链表 描述无向图
 15              */
 16             ArrayList<Integer>[] s = new ArrayList[m];
 17             for(int i=0; i<m; i++){
 18                 s[i] = new ArrayList<Integer>();
 19             }
 20             for(int j=0; j<n; j++){
 21                 int a = in.nextInt();
 22                 int b = in.nextInt();
 23                 s[a-1].add(b-1);
 24                 s[b-1].add(a-1);
 25             }
 26             in.close();
 27             //System.out.println("Begin check");
 28             Main Test = new Main();
 29
 30             /*
 31              * 查看是否符合 度数为奇数的点有2个或0个
 32              */
 33             int begin_State = Test.firstSuccess(s);
 34             if(begin_State==s.length){
 35                 System.out.println("Part");
 36                 return;
 37             }
 38             else{
 39
 40                 Test.DNF(s, begin_State);
 41                 for(int i=0;i<Test.result.size(); i++){
 42                     if(i>0)
 43                         System.out.print(" ");
 44                     System.out.print(Test.result.get(i));
 45                 }
 46                 //System.out.println(begin_State);
 47                 /*
 48                  * 查看是否为连通图
 49                  */
 50                 /*
 51                 boolean second =  Test.secondSuccess(s, begin_State);
 52                 if(second)
 53                     System.out.println("Full");
 54                 else
 55                     System.out.println("Part");
 56                 */
 57             }
 58
 59
 60
 61         }
 62
 63         public int firstSuccess(ArrayList[] s){
 64             int success = 0;
 65             int leng =s.length;
 66             int Max_simple=0;
 67             for(int i=0; i<leng; i++){
 68                 //System.out.println(s[i].toString());
 69                 int temp = s[i].size();
 70                 //System.out.print(temp);
 71                 if(temp%2==1){
 72                     success++;
 73                     Max_simple=i;
 74                     //System.out.println(i);
 75                 }
 76                 if(success>2)
 77                     break;
 78             }
 79             //System.out.println(success);
 80             if(success==2||success==0)
 81                 return Max_simple;
 82             else
 83                 return leng;
 84         }
 85
 86         public boolean secondSuccess(ArrayList[] s, int begin){
 87             int length = s.length;
 88             int [] Add = new int[length];
 89             int [] Checked = new int[length];
 90             Add[begin]=1;
 91             int Number=0;
 92             while(true){
 93                 int temp=0; int not_End=0;
 94                 for(int i=0; i<length; i++){
 95                     if(Add[i]==1&&Checked[i]==0){
 96                         temp=i;
 97                         not_End++;
 98                         break;
 99                     }
100                 }
101                 if(not_End==0)
102                     break;
103                 //System.out.println(temp);
104                 for(int k=0; k<s[temp].size();k++){
105                     Add[(int) s[temp].get(k)]=1;
106                 }
107                 Checked[temp]=1;    Number++;
108             }
109             //System.out.println(Number);
110             if(Number==length)
111                 return true;
112             else
113                 return false;
114         }
115
116
117         public void DNF(ArrayList[] s, int start){
118
119             while(true){
120
121                    if(s[start].size()>0){
122                        int temp = (Integer)s[start].get(0);
123                        s[start].remove(0);
124                        s[temp].remove((Integer)start);
125                        DNF(s, temp);
126                    }
127                    else
128                        break;
129             }
130             result.add(start+1);
131             //System.out.print(start);
132
133         }
134 }

时间: 2024-10-19 14:46:58

Hiho : 欧拉路径的相关文章

hiho欧拉路径(自留)

无向图 因为DFS本身就是一个入栈出栈的过程,所以我们直接利用DFS的性质来实现栈,其伪代码如下: DFS(u): While (u存在未被删除的边e(u,v)) 删除边e(u,v) DFS(v) End PathSize ← PathSize + 1 Path[ PathSize ] ← u 1 /** 2 2015.6.14 3 hiho一下 第五十周 4 欧拉路求路径 5 */ 6 7 #include<algorithm> 8 #include<iostream> 9 #i

欧拉路径 提高篇 hiho第51周

题目链接:hiho 第51周 思路:首先特判n=1的情况,无输出.对于其他的按有向欧拉路径的求法把欧拉路径求出来以后,第一个按位全输出,接下来的的(2^n-1)个点,只需要输出二进制最后一位就可以了.详细的思路参考hiho 第51周 /************************************************************** Problem:hiho 第51周 User: youmi Language: C++ Result: Accepted Time:17m

Fleury算法求欧拉路径 hiho第50周

题目链接: hiho一下 第五十周 思路:hiho已经讲的非常好了,我就不插嘴了. 提示:因为建边时同一条边同相反相的编号相近,比如(u-v)正向边u->v标号为0,反向边v->u标号为1,而0或1除以2都等于0,所以无论正反向建边,只要访问过正向反向中的任何一条边都可以用head[u]/2把原边标记为vis=1操作 /************************************************************** Problem:hiho 50 User: you

欧拉路径 基础题 hiho第49周

题目链接:hiho 第49周 思路: 定义:给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路. 性质:  1: 一个无向图存在欧拉路当且仅当该图是连通的且有且只有2个点的度数是奇数,此时这两个点只能作为欧拉路径的起点和终点.  2: 若图中没有奇数度的点,那么起点和终点一定是同一个点,这样的欧拉路叫做欧拉回路 利用性质做题就好了,具体的模拟hiho讲的非常清楚了 /****************************************************

hiho欧拉路&#183;二 ----- Fleury算法求欧拉路径

hiho欧拉路·二 分析: 小Ho:这种简单的谜题就交给我吧! 小Hi:真的没问题么? <10分钟过去> 小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了. 小Hi:哎,我就知道你会遇到问题. 小Ho:小Hi快来帮帮我! 小Hi:好了,好了.让我们一起来解决这个问题. <小Hi思考了一下> 小Hi:原来是这样...小Ho你仔细观察这个例子: 因为相连的两个数字总是相同的,不妨我们只写一次,那么这个例子可以写成:3-2-4-3-5-1.6个数字刚好有5个间隙,每个间隙两边的数字由

hiho一下 第五十周(欧拉路径)50

/////////////////////////////////////////////////////////////////////////////////////////////////////// 作者:tt267 声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 查看本文更新与讨论请点击:http://blog.csdn.net/tt2767/article/details/46493073 ////////////

hiho一下 第五十一周(有向图欧拉路径)51

/////////////////////////////////////////////////////////////////////////////////////////////////////// 作者:tt267 声明:本文遵循下面协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 查看本文更新与讨论请点击:http://blog.csdn.net/tt2767 链接被删请百度: CSDN tt2767 ////////////////

CodeForces 789D 欧拉路径计数,思维

CodeForces 789D 题意:n个点m条边的无向图,求经过其中m-2条边两次,剩下2条边一次的方案数有几种,如果剩下两条边的集合一样算同一种. tags: 选出两条边,其它m-2条边假想复制成两条,这样就是要求欧拉路径是否存在,即奇点个数是否为0或2. 所以该怎么选这两条边呢? 先把边分为自环边和普通边. 1.选取两条不相邻普通边,图中存在4个奇点,不满足欧拉路径条件: 2.选取两条相邻普通边,图中存在2个奇点,满足欧拉路径条件: 3.选取一条普通边一条自环,图中存在2个奇点,满足欧拉路

poj 2513 并查集,Trie(字典树), 欧拉路径

- Colored Sticks POJ - 2513 You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a straight line such that the colors of the endpoints that touch are of the same color?