zoukankan      html  css  js  c++  java
  • Hiho---欧拉图

    欧拉路·一

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏。现在他们控制的角色来到了一个很大的湖边。湖上有N个小岛(编号1..N),以及连接小岛的M座木桥。每座木桥上各有一个宝箱,里面似乎装着什么道具。

    湖边还有一个船夫,船夫告诉主角。他可以载着主角到任意一个岛上,并且可以从任意一个岛上再载着主角回到湖边,但是主角只有一次来回的机会。同时船夫告诉主角,连接岛屿之间的木桥很脆弱,走过一次之后就会断掉。

    因为不知道宝箱内有什么道具,小Hi和小Ho觉得如果能把所有的道具收集齐肯定是最好的,那么对于当前岛屿和木桥的情况,能否将所有道具收集齐呢?

    举个例子,比如一个由6个小岛和8座桥组成的地图:

    主角可以先到达4号小岛,然后按照4->1->2->4->5->6->3->2->5的顺序到达5号小岛,然后船夫到5号小岛将主角接回湖边。这样主角就将所有桥上的道具都收集齐了。

    提示:欧拉路的判定

    输入

    第1行:2个正整数,N,M。分别表示岛屿数量和木桥数量。1≤N≤10,000,1≤M≤50,000

    第2..M+1行:每行2个整数,u,v。表示有一座木桥连接着编号为u和编号为v的岛屿,两个岛之间可能有多座桥。1≤u,v≤N

    输出

    第1行:1个字符串,如果能收集齐所有的道具输出“Full”,否则输出”Part”。

    样例输入
    6 8
    1 2
    1 4
    2 4
    2 5
    2 3
    3 6
    4 5
    5 6
    样例输出
    Full


    代码: 经过Hiho验证,符合题目要求。
      1 import java.util.ArrayList;
      2 import java.util.Scanner;
      3 
      4 
      5 public class Main {
      6 
      7         public static void main(String[] argv){
      8             
      9             Scanner in = new Scanner(System.in);
     10             int m = in.nextInt();
     11             int n = in.nextInt();
     12             /*
     13              * 用可变长数组来代替链表 描述无向图
     14              */
     15             ArrayList<Integer>[] s = new ArrayList[m];
     16             for(int i=0; i<m; i++){
     17                 s[i] = new ArrayList<Integer>();
     18             }
     19             for(int j=0; j<n; j++){
     20                 int a = in.nextInt();
     21                 int b = in.nextInt();
     22                 s[a-1].add(b-1);
     23                 s[b-1].add(a-1);
     24             }
     25             in.close();
     26             //System.out.println("Begin check");    
     27             Main Test = new Main();
     28             /*
     29              * 查看是否符合 度数为奇数的点有2个或0个
     30              */
     31             int begin_State = Test.firstSuccess(s);
     32             if(begin_State==s.length){
     33                 System.out.println("Part");
     34                 return;
     35             }
     36             else{
     37                 //System.out.println(begin_State);
     38                 /*
     39                  * 查看是否为连通图
     40                  */
     41                 boolean second =  Test.secondSuccess(s, begin_State);
     42                 if(second)
     43                     System.out.println("Full");
     44                 else
     45                     System.out.println("Part");
     46             }
     47             
     48         }
     49         
     50         public int firstSuccess(ArrayList[] s){
     51             int success = 0;
     52             int leng =s.length;
     53             int Max_simple=0;
     54             for(int i=0; i<leng; i++){
     55                 //System.out.println(s[i].toString());
     56                 int temp = s[i].size();
     57                 //System.out.print(temp);
     58                 if(temp%2==1){
     59                     success++;
     60                     Max_simple=i;
     61                     //System.out.println(i);
     62                 }                    
     63                 if(success>2)
     64                     break;
     65             }
     66             //System.out.println(success);
     67             if(success==2||success==0)
     68                 return Max_simple;
     69             else
     70                 return leng;
     71         }
     72         
     73         public boolean secondSuccess(ArrayList[] s, int begin){
     74             int length = s.length;
     75             int [] Add = new int[length];
     76             int [] Checked = new int[length];
     77             Add[begin]=1;
     78             int Number=0;
     79             while(true){
     80                 int temp=0; int not_End=0;
     81                 for(int i=0; i<length; i++){
     82                     if(Add[i]==1&&Checked[i]==0){
     83                         temp=i;
     84                         not_End++;
     85                         break;
     86                     }
     87                 }                
     88                 if(not_End==0)
     89                     break;
     90                 //System.out.println(temp);
     91                 for(int k=0; k<s[temp].size();k++){
     92                     Add[(int) s[temp].get(k)]=1;
     93                 }
     94                 Checked[temp]=1;    Number++;        
     95             }
     96             //System.out.println(Number);
     97             if(Number==length)
     98                 return true;
     99             else
    100                 return false;
    101         }
    102 }
  • 相关阅读:
    一个int类型究竟占多少个字节
    TCMalloc 安装与使用
    [创意标题] spoj 11354 Amusing numbers
    如何更好地理解和使用Github
    一天JavaScript示例-点击图片显示大图片添加鼠标
    php方法综述除去换行符(PHP_EOL使用变量)
    使用jQuery和css3实现了仿淘宝ued博客左边的菜单切换动画
    【软件使用技巧】PL/SQL Developer实现双击table询
    newlisp 接受jenkins带空格的参数
    Oracle listener lsnrctl
  • 原文地址:https://www.cnblogs.com/udld/p/4564273.html
Copyright © 2011-2022 走看看