1. 程式人生 > >uva1599 bfs雙向遍歷 利用陣列儲存中間結果

uva1599 bfs雙向遍歷 利用陣列儲存中間結果

  1. bfs雙向遍歷。
    a. 雙向遍歷可以儲存多條最短路。
    b. 無權無向圖,還可以提升bfs效率,是單向bfs的2倍。
  2. 利用額外的陣列儲存值。
  3. 反向遍歷輸出路徑。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define maxn 100000+5
using namespace std;
vector
<int>
g[maxn];//圖的連通 vector<int> c[maxn];//圖的顏色 int n,m,vis[maxn],d[maxn],ans[maxn];//d儲存距離,ans儲存最小顏色 int init(){//初始化 int x,y; int temp; memset(vis,0,sizeof(vis)); memset(d,0,sizeof(d)); memset(ans,0,sizeof(ans)); for (int i=0;i<=n;i++)g[i].clear(); for (int i=0;i<=n;i++)c[i].clear(); for
(int i=0;i<m;i++){ cin>>x>>y; g[x].push_back(y); g[y].push_back(x); cin>>temp; c[x].push_back(temp); c[y].push_back(temp); } } void bfs1(int n)//進行距離的遍歷,完成d陣列。 { memset(d,-1,sizeof(d)); queue<int> q; d[n]=0; q.push(n); while
(!q.empty()) { int u=q.front();q.pop(); int sz=g[u].size(); for(int v=0;v<sz;v++) { int vv=g[u][v]; if(vv==1) { d[1]=d[u]+1; return; } if(d[vv]==-1) { d[vv]=d[u]+1; q.push(vv); } } } return; } void bfs2()//對顏色進行排序,並儲存顏色 { memset(vis,0,sizeof(vis)); queue<int> q; q.push(1); while(!q.empty()) { int u=q.front();q.pop(); if(d[u]==0) return; int sz=g[u].size(); int mm=-1; for(int i=0;i<sz;i++)//找到最小的顏色 { int vv=g[u][i]; if(d[vv]==d[u]-1) { if(mm==-1) mm=c[u][i]; else mm=min(mm,c[u][i]); } } int t=d[1]-d[u]; if(ans[t]==0) ans[t]=mm; else ans[t]=min(mm,ans[t]); for(int v=0;v<sz;v++) //將同時滿足條件的節點加入佇列,並同時進行bfs。 { int vv=g[u][v]; if(vis[vv]==0&&d[vv]==d[u]-1&&c[u][v]==mm) { q.push(vv); vis[vv]=1; } }//通過額外的陣列儲存最小的顏色來篩選出不符合的同等條件後序遍歷結果。若輸出節點則還需進行標識並在此回返。 } return; } int main() { while (cin>>n>>m){ init(); bfs1(n); bfs2(); printf("%d\n",d[1]); for(int i=0;i<d[1];i++) { if(i) printf(" "); printf("%d",ans[i]); } printf("\n"); } }

相關推薦

uva1599 bfs雙向 利用陣列儲存中間結果

bfs雙向遍歷。 a. 雙向遍歷可以儲存多條最短路。 b. 無權無向圖,還可以提升bfs效率,是單向bfs的2倍。 利用額外的陣列儲存值。 反向遍歷輸出路徑。 #include <

(方法)給定一個有序數列,通過中序利用陣列建立起二叉查詢樹(PAT1064)

建樹的時候,有時候沒有必要大費周章地去通過結點構造一棵二叉樹,我們利用各結點之間的數學關係,通過陣列就可以實現一棵二叉樹,假設結點序列為a,那麼其左子就是a*2,右子就是a*2+1 由於二叉樹中序遍歷的結果是一串有序序列,那麼我們可以通過中序來得到一棵二叉樹 void l

JS中普通陣列和字典陣列的區別

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

二叉樹----資料結構:二叉樹的三種,利用遞迴演算法。

二叉樹----資料結構:二叉樹的三種遍歷,利用遞迴演算法。     魯迅:總之歲月漫長,然而值得等待。   #define CHAR /* 字元型 */  /* #define INT /* 整型(二者選一) */  #

Python:目錄--利用glob模組

#!/usr/bin/env python # coding:UTF-8 """ @version: python3.x @author:曹新健 @contact: [email protected] @software: PyCharm @file: glob模組.py @time:

Python:目錄--利用os.walk進行目錄

#!/usr/bin/env python # coding:UTF-8 """ @version: python3.x @author:曹新健 @contact: [email protected] @software: PyCharm @file: 利用os.walk進行目錄遍歷.

ArrayList類的實現,利用陣列儲存元素

避免與類庫中的ArrayList混淆,我將我實現的類命名為MyArrayList 基本思想:在MyArrayList內部用一個數組來儲存插入元素,元素滿則擴充陣列容量。 實現細節如下: 1、儲存基礎陣列,陣列的容量,以及儲存在MyArrayList中的當前項; 2、提供

JQuery $.eachJavaScript陣列物件例項

檢視一個簡單的jQuery的例子來遍歷一個JavaScript陣列物件。 var json = [ {"id":"1","tagName":"apple"}, {"id":"2","tagName":"orange"}, {"id":"3","tagName":"bana

集合Set迭代器陣列

import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class IteratorAndArra

【C++】結構指標結構陣列

#include"iostream.h" #include"stdio.h" struct people { char name[10]; int age; }; people pe[] = {

c語言字串陣列的方法

在這裡我們重點介紹遍歷字串的三種方法。   首先我們來看一道程式設計題目:   輸入一個字串,且都是數字,也可以是負數,轉化成相應的整型數並輸出,若輸入字母則停止。   我們知道,在C語言裡有一個函式是“atoi”,它可以把字串轉換成整型數,包含在標頭檔案stdlib

JavaScript中如何物件陣列

我們知道在javaScript中可以定義一類特殊的‘陣列'——物件陣列var point = {x:0,y:0} <pre code_snippet_id="1607695" var john={"name":"john","sex":"meal","height":

javascript閉包理解之onload事件獲取陣列元素

我們在學javascript的時候是否遇到過這樣的程式碼,例如我們要在onload事件裡迴圈遍歷一個數組,對遍歷到的陣列元素進行操作。需要用到this物件,如下程式碼所示: onload = fu

PHP foreach關聯陣列

<?php $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); foreach($age as $x=>$x_value) { echo "Key=" . $x . ", Value=

【Angular】ng-repeat輸出陣列

今天剛好做選擇題選項的顯示,拿到String型別的4個選項的集合,用分號分隔,然後做切割(split()); A.相對,絕對;B.理論,實際;C.效率,比功;D.簡單,聯合; 先展示成功案例,然後再說之前報錯的地方; 1、js程式碼: funct

C語言中for迴圈陣列元素賦值需注意的問題

在C語言中,我們通常是用malloc函式分配記憶體得到一個數組a,然後使用for迴圈遍歷給陣列賦值,賦值的方式有很多種,比如a[i]=i,*(a++)=i,建議使用第一種方法,第二種方法一不小心就容易出錯,看下面的一個程式設計例子 我們使用*(data_col++) =

JQueryjson陣列

{'12':'安徽省','33':'澳門特別行政區','1':'北京市','13':'福建省','28':'甘肅省','19':'廣東省','20':'廣西壯族自治區','24':'貴州省','21':'海南省','3':'河北省','16':'河南省','8':'黑龍江省

用jquery實現cookie的操作以及建立js陣列js陣列,js物件,jquery.json的使用

我為什麼把這些內容放在一個文章了說呢?因為在真實使用的時候一般都會設計到。在讀取cookei時肯定會有相應的其他操作。 用jquery實現對cookie的操作,這裡用到的是:jquery.cookie.js,一個輕量級的cookie 外掛,可以讀取、寫入、刪除 cookie

php關聯陣列

$arr=['red'=>'蘋果','orange'=>'橙子','green'=>'西瓜']; key():是當前陣列指標的鍵名,current()當前陣列指標的值,next()將陣列指標往後移一個座標  //for迴圈遍歷 for($i=0;$i&