【圖】最短路徑——Floyed算法和Dijkstra算法

最短路徑問題(floyed.cpp dijkstra.cpp)


題目描述
平面上有n個點(n<=100),每個點的坐標均在-10000~10000之間。其中的一些點之間有連線。若有連線,則表示可從一個點到達另一個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的任務是找出從一點到另一點之間的最短路徑。
輸入
第1行:1個整數n
第2..n+1行:每行2個整數x和y,描述了一個點的坐標
第n+2行:1個整數m,表示圖中連線的數量
接下來有m行,每行2個整數i和j,表示第i個點和第j個點之間有連線
最后1行:2個整數s和t,分別表示源點和目標點
輸出
第1行:1個浮點數,表示從s到t的最短路徑長度,保留2位小數
樣例輸入
5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5
樣例輸出

3.41

#------------------------------------------------------------------------------#

最短路徑也是有很多方法的,這里就講講Floyed和Dijkstra。

Floyed:

這種算法比較好理解,且可以求任意兩點間的最短路徑,但速度很慢,為O(N^3)

首先,需要k[i][j]存從第i點到第j點間的最短路徑,如果它們不相連,則為∞(無窮大)(在這里可以設為0x7fffffff,0x表示后面的數為16進制,7fffffff即是16進制數,化為10進制等于2147483647)。

然后需要3層循環,第一層:需要經過的點p,第二、三層起點i和終點j,然后就開始推,很像動規的,“狀態轉移方程”為:k[i][j]=min(k[i][j],k[i][p]+k[p][j])

這樣不用考慮兩點沒聯通的情況嗎?之前的∞就有作用了,如果兩點沒聯通的話是賦不了值的。

代碼Floyed

#include<cstdio>
#include<cmath>
struct p
{int x,y;
}a[102];//這個結構體是存平面直角坐標系的
int f[102][102];
double k[102][102];
int n,m,hhd;
int main()
{//freopen("floyed.in","r",stdin);//freopen("floyed.out","w",stdout);//文件輸入輸出int b,e;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);scanf("%d",&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);f[x][y]=f[y][x]=1;//鄰接數組標記}scanf("%d%d",&b,&e);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(f[i][j])//如果兩點有連接k[i][j]=sqrt(pow(a[i].x-a[j].x,2.0)+pow(a[i].y-a[j].y,2.0));//求兩點距離,存入k數組elsek[i][j]=0x7fffffff;//反之則設為極大值for(int p=1;p<=n;p++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(k[i][j]>k[i][p]+k[p][j])k[i][j]=k[i][p]+k[p][j];//開始算法printf("%.2lf",k[b][e]);//輸出從起點(b)到終點(e)的最短路徑return 0;
}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?----我只是個小分割線----

Dijkstra:

此算法較(只是較前一種)快,時間復雜度為O(N^2),注意,它不能處理負邊權的情況

而且這個只能求從一個起點(單源點)到其他任何點的距離,但解決這道題足夠了。

一個一維數組dis[i]表示起點到i點的最短距離,k數組與上同,還需要一個bool數組判斷該點是否用過。

思路:從起點到某個點一定會經過一個及以上的“中間點”,可以發現從起點到i點的最短路徑中的每一個“中間點”到起點的距離都是相等的,就像動態規劃的“最優子結構”性質,所以只要找出每個點的最短路徑,即可知道起點到終點的最短路徑。

為什么不能處理負邊權呢?


如圖,假如想要從1到3,最短的顯然為1->2->3,共-2,但Dijkstra算法會先選擇直接到3,因為這樣為1,所以答案錯誤。

代碼(Dijkstra):

#include<cstdio>
#include<cmath>
#include<cstring>
struct p
{int x,y;
}a[102];
int _f[102][102];
bool f[102];
double k[102][102],dis[102];
int n,m;
int main()
{//freopen("dijkstra.in","r",stdin);//freopen("dijkstra.out","w",stdout);int b,e;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);scanf("%d",&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);_f[x][y]=_f[y][x]=1;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(_f[i][j])k[i][j]=sqrt(pow(a[i].x-a[j].x,2.0)+pow(a[i].y-a[j].y,2.0));elsek[i][j]=0x7fffffff;//以上與Floyed相同scanf("%d%d",&b,&e);f[b]=1;for(int i=1;i<=n;i++)dis[i]=k[b][i];//將距離存進去for(int i=1;i<=n-1;i++){int p=0x7fffffff,w=0;//p為當前最小值,w為“中間點”下標for(int j=1;j<=n;j++)if(f[j]==0&&dis[j]<p){w=j;p=dis[j];//更新最小值}//查找“中間點”if(w==0)break;//如果全部沒有,則表示找完了f[w]=1;//標記此點已用for(int j=1;j<=n;j++)if(dis[w]+k[w][j]<dis[j])dis[j]=dis[w]+k[w][j];//開始找進過w的最小值}printf("%.2lf",dis[e]);//輸出return 0;
}


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?By WZY

轉載于:https://www.cnblogs.com/LinqiongTaoist/p/7203760.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372187.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372187.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372187.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java的empty_Java Stack empty()方法與示例

堆棧類empty()方法empty()方法在java.util包中可用。empty()方法用于檢查此堆棧是否為空。empty()方法是一個非靜態方法&#xff0c;只能通過類對象訪問&#xff0c;如果嘗試使用類名稱訪問該方法&#xff0c;則會收到錯誤消息。在檢查空狀態時&#xff0c;empty()方法不會引發…

Java并發– CyclicBarrier示例

Java中的CyclicBarrier是JDK 5中java.util.Concurrent包中引入的同步器&#xff0c;以及其他并發實用程序&#xff08;如Counting Semaphore &#xff0c; BlockingQueue &#xff0c; ConcurrentHashMap等&#xff09;。CyclicBarrier與CountDownLatch類似&#xff0c;我們在上…

java i o總結_Java I/O 總結

一、IO流的三種分類方式1.按流的方向分為&#xff1a;輸入流和輸出流2.按流的數據單位不同分為&#xff1a;字節流和字符流3.按流的功能不同分為&#xff1a;節點流和處理流二、IO流的四大抽象類&#xff1a;字符流&#xff1a;Reader Writer字節流&#xff1a;InputStream(讀數…

try...catch 語句

一般情況下&#xff0c;我們很少用到 try...catch 語句&#xff0c;但是有時候為了測試代碼中的錯誤&#xff0c;也有可能會用到。小白我也在工作中用到過。那么好的程序設計&#xff0c;什么時候會用到呢&#xff1f; try...catch 一般用來捕獲宿主對象或者ECMAScript拋出的異…

用Mockito回答

在編寫單元測試時 &#xff0c;必須牢記不要依賴外部組件。 為了避免這種情況&#xff0c;我們使用了模擬框架&#xff0c;對我來說&#xff0c;最容易使用的是Mockito 。 在本文中&#xff0c;我們將看到在Mockito中使用的一種“高級”技術&#xff0c;可以使用Answer接口在模…

java三板斧_Java 枚舉使用三板斧

Java 枚舉使用三板斧1 定義public enum CountryEnums {ONE(1,"韓"),TWO(2,"魏"),THREE(3,"楚"),FOUR(4,"燕"),FIVE(5,"趙"),SIX(6,"齊");private Integer retCode;private String retMsg;// 枚舉的構造方法是 pri…

假裝這些是MyEclipse的快捷鍵(1)

Java快捷鍵 Alt / 代碼自動補全Alt Shift S 功能菜單 Ctrl 1 代碼自動修正Ctrl / 單行注釋/取消Ctrl O 查看類的所有方法Ctrl T 查看類的集成架構圖Ctrl Shift / 多行注釋Ctrl Shift \ 取消多行注釋Ctrl Shift F 代碼格式化轉載于:https://www.cnblogs.com/swordt…

JasperReports JSF插件用例–簡單列表報告

這是JasperReports JSF插件系列的第一篇“用例文章” &#xff0c;我將專注于一個簡單的需求&#xff0c;并且我將進一步深入。 起點是我們已經為圖書商店完成的項目設置&#xff0c;我將向其中添加一個列表&#xff0c;其中包含在數據庫中注冊的其他圖書&#xff0c;該列表也將…

2016.10.17先占坑

2016.10.17先占坑轉載于:https://www.cnblogs.com/amurzet/p/5978986.html

ER圖流程圖

ER圖&#xff1a;ER圖分為實體、屬性、關系三個核心部分。實體是長方形體現&#xff0c;而屬性則是橢圓形&#xff0c;關系為菱形。 圖書館管理系統流程圖&#xff08;圖片源于網上&#xff09;&#xff1a;對于程序員來說&#xff0c;我們要知道&#xff1a;整個系統中&#x…

php源碼仿三一重工,織夢仿三一重工業大學氣企業網站php源碼

★模板引薦★源碼稱呼&#xff1a;仿三一重工業大學氣企業網站php源碼仿三一重工業大學氣企業網站php源碼&#xff0c;嘗試完備無錯&#xff0c;兼容合流欣賞器。模板包括安置證明&#xff0c;并包括嘗試數據。本模板鑒于DEDECms 5.7 GBK安排&#xff0c;須要 UTF-8版本的請本人…

接觸Jenkins(Hudson)API,第2部分

這篇文章從本教程的第1部分繼續。 已經快一年了&#xff0c;但是我終于有時間重新審視我為與Jenkins api交互而編寫的一些代碼。 我已經使用了部分工作來幫助管理許多Jenkins構建服務器&#xff0c;主要是保持插件同步以及將作業從一臺機器移動到另一臺機器。 在本文中&#xf…

php樹莓派魔鏡,用樹莓派和顯示器制作一面“魔鏡”

所需要的材料一臺顯示器一塊和顯示器大小相同的雙面鏡一些2*4米的細木條樹莓派機器必要組件(電源、HDMI線、usb無線網卡、鍵盤)木工工具(鋸子、磨砂機、螺絲刀)螺絲、液態釘子選一個合適的顯示器鏡子的大小完全由顯示器的類型和大小決定&#xff0c;所以我希望得到一個盡量大的…

【數字圖像處理】[3]--直方圖規范化

【數字圖像處理】[3]--直方圖規范化直方圖規范化出現的原因是因為直方圖均衡只能產生出固定的圖像&#xff0c;不滿足于需求&#xff0c;有時我們需要讓直方圖變成特定的直方圖&#xff0c;于是有了直方圖規范化原理&#xff1a;可能只看公式沒什么感覺&#xff0c;我們來舉一個…

JavaFX 2.0布局窗格– GridPane

毫無疑問&#xff0c; GridPane是JavaFX 2.0中功能最強大&#xff0c;最靈活的布局窗格。 它在由行和列組成的靈活網格中布置其子項&#xff0c;與Swing的GridBagLayout或HTML的表格模型非常相似。 這種方法使該窗格非常適合于任何形式的表單&#xff08;例如網站上的聯系表單&…

leecode 題解 || Merge k Sorted Lists 問題

problem&#xff1a; Merge k sorted linked lists and return it as one sorted list.Analyze and describe its complexity.Tags Divide and Conquer Linked List Heap合并K個已序單鏈表 thinking&#xff1a; &#xff08;1&#xff09;題目沒有要求不能夠新開ListNode,所以…

PHP在瀏覽器中被拒絕請求,php控制請求頁面瀏覽器緩

緩存的主要作用是防止用戶頻繁刷新網站頁面&#xff0c;導致服務器數據庫負擔&#xff0c;既要保證信息更新的及時性&#xff0c;也要保證緩存能被充分利用。http協議里控制瀏覽器緩存的頭有三個Cache-Control&#xff0c;Expires&#xff0c;Last-Modified&#xff0c;在PHP下…

js -03課 -03 js中的真假判斷

真假的問題&#xff1a;數據類型-數字&#xff08;NaN&#xff09;、字符串、布爾、函數、對象&#xff08;elem、[]、{}、null&#xff09;、未定義真&#xff1a;非0的數字、非空字符串、true、函數、能找到的元素、[]、{}假&#xff1a;0、NaN、空字符串、false、不能找到的…

HBASE啟動失敗,Failed construction of Master: class org.apache.hadoop.hbase.master.HMaster

Master日志錯誤&#xff1a;2015-12-02 06:34:32,394 ERROR [main] master.HMasterCommandLine: Master exitingjava.lang.RuntimeException: Failed construction of Master: class org.apache.hadoop.hbase.master.HMasterat org.apache.hadoop.hbase.master.HMaster.constru…

Java線程:我應該創建幾個

介紹 “我應該創建多少個線程&#xff1f;”。 許多年前&#xff0c;我的一個朋友問我這個問題&#xff0c;然后我按照“ CPU核心數 1”的指示給了他答案。 當您在這里閱讀時&#xff0c;大多數人都在點頭。 不幸的是&#xff0c;我們所有人當時都錯了。 現在&#xff0c;如果您…