hdu1181变形课dfs/bfs/并查集三种解法(java)
題目鏈接
Problem Description
呃…變形課上Harry碰到了一點(diǎn)小麻煩,因?yàn)樗⒉幌馠ermione那樣能夠記住所有的咒語(yǔ)而隨意的將一個(gè)棒球變成刺猬什么的,但是他發(fā)現(xiàn)了變形咒語(yǔ)的一個(gè)統(tǒng)一規(guī)律:如果咒語(yǔ)是以a開(kāi)頭b結(jié)尾的一個(gè)單詞,那么它的作用就恰好是使A物體變成B物體.
Harry已經(jīng)將他所會(huì)的所有咒語(yǔ)都列成了一個(gè)表,他想讓你幫忙計(jì)算一下他是否能完成老師的作業(yè),將一個(gè)B(ball)變成一個(gè)M(Mouse),你知道,如果他自己不能完成的話,他就只好向Hermione請(qǐng)教,并且被迫聽(tīng)一大堆好好學(xué)習(xí)的道理.
Input
測(cè)試數(shù)據(jù)有多組。每組有多行,每行一個(gè)單詞,僅包括小寫字母,是Harry所會(huì)的所有咒語(yǔ).數(shù)字0表示一組輸入結(jié)束.
Output
如果Harry可以完成他的作業(yè),就輸出"Yes.",否則就輸出"No."(不要忽略了句號(hào))
Sample Input
so
soon
river
goes
them
got
moon
begin
big
0
Sample Output
Yes.
Hint
Hint
Harry 可以念這個(gè)咒語(yǔ):“big-got-them”.
首先這是一題水題。但是題目比較靈活,解題思路較多,溫習(xí)下各種算法的實(shí)現(xiàn)。
并查集:
- 這題因?yàn)槭遣檎易罱K的關(guān)系,所以可以用并查集來(lái)處理對(duì)象的關(guān)系,進(jìn)行查找合并,最終查看b點(diǎn)是否為m點(diǎn)的父親。這合并的過(guò)程要注意不能壓縮路徑,并且m點(diǎn)不做父節(jié)點(diǎn)。因?yàn)閙是根節(jié)點(diǎn)防止m成為父節(jié)點(diǎn)造成關(guān)系混亂。
dfs:
- 可以用list[]數(shù)組作為靈界表儲(chǔ)存各個(gè)節(jié)點(diǎn)信息,因?yàn)楣?jié)點(diǎn)都是’a’-'z’的節(jié)點(diǎn),所以可以直接深搜。
bfs:
- 這題bfs也可以,用隊(duì)列添加m(12),從m點(diǎn)開(kāi)始遍歷找到’b’點(diǎn),輸出結(jié)果。
注意點(diǎn):
輸入多組數(shù)據(jù),不僅僅是一項(xiàng)到0多組數(shù)據(jù),到0輸出后還有初始化參數(shù)完成下一輪,也就是這題理論是沒(méi)有輸入結(jié)束狀態(tài)的!wa了好久因?yàn)檫@個(gè)。
并查集:
import java.util.Scanner;public class 杭電1181并查集 {static int a[];//儲(chǔ)藏父節(jié)點(diǎn)public static void main(String[] args) {// TODO 自動(dòng)生成的方法存根 Scanner sc=new Scanner(System.in);init();while(sc.hasNext()){String str=sc.next();if(str.equals("0")) {int index=a[12];if(a[12]==-1) {System.out.println("No.");}//m這個(gè)點(diǎn)沒(méi)有父親else{int value=search(12);if(value==1) {System.out.println("Yes.");}else System.out.println("No.");}init();}else{int start=str.charAt(0)-'a';int end=str.charAt(str.length()-1)-'a';join(start, end);}}}static void init() {a=new int[26];for(int i=0;i<26;i ){a[i]=-1;}}static int search(int i)//查找父節(jié)點(diǎn)編號(hào) {if(a[i]==-1)return i;else return search(a[i]);}static void join(int b1,int b2)//b1<-b2 b1為父親{int a1=search(b1);//b1父節(jié)點(diǎn)int a2=search(b2);//b2 父節(jié)點(diǎn)if(a1==a2) {}//已經(jīng)在一棵樹(shù)上 else if(a1==12) {}//m點(diǎn)不做任何點(diǎn)的父節(jié)點(diǎn),他是最底層的根節(jié)點(diǎn)else if(a2==1){}//b不做兒子,只做父親,不然m點(diǎn)最上父節(jié)點(diǎn)可能是b爸爸else {a[a2]=a1;}} }dfs:
import java.util.ArrayList; import java.util.List; import java.util.Scanner;public class 杭電1181dfs {static boolean judgle=false;public static void main(String[] args) {// TODO 自動(dòng)生成的方法存根Scanner sc=new Scanner(System.in);Listlist[]=new ArrayList[26];for(int i=0;i<26;i ){list[i]=new ArrayList<>();}boolean jud[]=new boolean[26];while(sc.hasNext()){String str=sc.nextLine();if(str.equals("0")) {dfs(list,1,jud);if(judgle) {System.out.println("Yes.");}else System.out.println("No.");//初始化參數(shù)judgle=false;jud=new boolean[26];for(int i=0;i<26;i ){list[i]=new ArrayList<>();}}else {char font=str.charAt(0);char end=str.charAt(str.length()-1);if(font!=end)list[(int)(font-'a')].add((int)(end-'a')); }}}private static void dfs(List[] list, int i, boolean[] jud) {// TODO 自動(dòng)生成的方法存根if(i==12) {judgle=true;}if(!judgle){for(int j=0;j>map=new HashMap<>();while(sc.hasNext()){String s=sc.nextLine();if(s.equals("0")){Queue q1=new ArrayDeque<>();if(!map.containsKey("b")) {System.out.println("No.");}else{Set jud=new HashSet<>();q1.add("b");jud.add("b");boolean j=false;while(!q1.isEmpty()){String node=q1.poll();if(node.equals("m")){System.out.println("Yes.");j=true;break;}else{if(map.containsKey(node)){Set set2=map.get(node);for(String team:set2){if(jud.contains(team)) {continue;}else{jud.add(team);q1.add(team);}}}}}if(!j) {System.out.println("No.");}}map.clear();}String start=s.substring(0, 1);String end=s.substring(s.length()-1);if(map.containsKey(start)) {Set set2=map.get(start);set2.add(end); map.put(start, set2);}else {Set set=new HashSet<>();set.add(end);map.put(start, set);}} } }list套數(shù)組法:
import java.util.ArrayDeque; import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.Scanner; public class 杭電11811 {public static void main(String[] args) {// TODO 自動(dòng)生成的方法存根Scanner sc=new Scanner(System.in);Listlist[]=new ArrayList[26];for(int i=0;i<26;i ){list[i]=new ArrayList<>();}boolean jud[]=new boolean[26];while(sc.hasNext()){String str=sc.nextLine();if(str.equals("0"))//b m 1 11{ Queueq1=new ArrayDeque<>();q1.add(1);jud[1]=true;boolean bool=false;while(!q1.isEmpty()){int team=q1.poll();if(team==12) {System.out.println("Yes.");bool=true;break;}else{for(int j=0;j();}jud=new boolean[26];}else {char font=str.charAt(0);char end=str.charAt(str.length()-1);if(font!=end)list[(int)(font-'a')].add((int)(end-'a')); }}} }水平有限,如果有錯(cuò),還請(qǐng)大佬指正。
- 如果對(duì)后端、爬蟲(chóng)、數(shù)據(jù)結(jié)構(gòu)算法等感性趣歡迎關(guān)注我的個(gè)人公眾號(hào)交流:bigsai
總結(jié)
以上是生活随笔為你收集整理的hdu1181变形课dfs/bfs/并查集三种解法(java)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: poj3061尺取法/前缀和 二分(ja
- 下一篇: poj3320Jessica's Rea