無權(quán)圖的最短路徑
思路:無權(quán)圖的最短路徑也就是要求兩點(diǎn)之間最少幾跳可達(dá),那么我們可以這樣,用廣度遍歷,從起點(diǎn)開始一層層遍歷,如果第一次遍歷到終點(diǎn),那么肯定是最短路徑。
public static void findPath(int start,int end) { //創(chuàng)建一個(gè)隊(duì)列來存儲(chǔ) LinkedList< VNode> queue=new LinkedList<VNode>(); queue.offer(nodes[start]); while(!queue.isEmpty()) { VNode vnode=queue.peek(); isVisit[vnode.index]=true; BNode bnode=vnode.bnode; //如果結(jié)束點(diǎn)已經(jīng)訪問 跳出循環(huán) if(isVisit[end]) break; //如果他的鄰節(jié)點(diǎn)都訪問或者沒有鄰節(jié)點(diǎn) 跳出循環(huán) while(bnode!=null) { //如果鄰節(jié)點(diǎn)還沒被訪問訪記錄他的上一節(jié)點(diǎn),否則不進(jìn)行記錄。這樣的話即使到了下一跳有這個(gè)頂點(diǎn),記錄的也是更的短路徑,比如說起點(diǎn)A 鄰節(jié)點(diǎn)有BCD B的鄰節(jié)點(diǎn)是C,此時(shí)遍歷A的鄰節(jié)點(diǎn)C的時(shí)候,就記錄C的上一節(jié)點(diǎn)是A,下次遍歷B的領(lǐng)節(jié)點(diǎn),因?yàn)镃已經(jīng)被訪問,所以C記錄的上一節(jié)點(diǎn)還是A,這樣就保證了最短路徑。 if(!isVisit[bnode.index]) {&nb