All Sources Shortest Path The Floyd-Warshall Algorithm

Slides:



Advertisements
Similar presentations
跳出思维定势的盒子 南京外国语学校 朱善萍. 问题的提出 1. 中学英语教学的全方位目标 ( 含高三 ) 有效性 ( 含高三、高考 ) 科学性 ( 含高三和高考 ) ? 学生学习目标的多元性 ? 2.“ 懒教师 ” 与聪明学生 ? 为什么学了 年英语后, 中考或高考只有 60% 左右的得分率.
Advertisements

While 迴圈 - 不知重複執行次數
C++语言程序设计教程 第5章 构造数据类型 第6章 C++程序的结构.
第 2 章 初探 C++.
2016中重卡网络规划 中重卡营销部 2016年6月.
鸿门宴 司马迁.
第一次世界大战的时候,一位法国飞行员在2 000 m高空飞行的时候,发现脸旁有一个小玩意儿在游动着,飞行员以为这是一只小昆虫,敏捷地把它一把抓了过来,令他吃惊的是,他发现他抓到的竟是一颗德国子弹!     问题:大家都知道,子弹的飞行速度是相当快的,这名法国飞行员为什么会有这么大的本领呢?为什么飞行员能抓到子弹?
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
第八章 类和对象.
C++程序设计 王希 图书馆三楼办公室.
資料大樓 --談指標與陣列 綠園.
函數(一) 自訂函數、遞迴函數 綠園.
第4章 函数与预处理 4.1 概述 4.2 定义函数的一般形式 4.3 函数参数和函数的值 4.4 函数的调用 *4.5 内置函数
教材 《C++程序设计》.谭浩强. 清华大学出版社 王雪晶
C 程式設計— 指標.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
第一章 程序的基本结构. 第一章 程序的基本结构 教材及授课结构 本章目标 基本内容 扩展阅读 上机指导 应用举例 习题.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
Object-Oriented Programming in C++ 第一章 C++的初步知识
程式撰寫流程.
101北一女中 資訊選手培訓營 最短路徑 Shortest Path Nan.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
C++程序设计 string(字符串类) vector(容器类).
C++语言程序设计 第二章 C++简单程序设计.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
谭浩强 编著 中国高等院校计算机基础教育课程体系规划教材 C++程序设计.
C++语言程序设计 第十一章 流类库与输入/输出.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
东北林业大学 陈宇 ACM程序设计 东北林业大学 陈宇
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
六、函数 教学目标: 函数的概念、定义、调用和返回 带自定义函数的程序设计 递推算法 递归思想及算法实现 函数的参数传递方式 C语言程序设计.
C++大学基础教程 第3章 C++控制语句 北京科技大学 信息基础科学系.
第四章 第三节 最短路径算法.
Floyd-Warshall 算法构造最短路径
C++大学基础教程 第11章 多态性 北京科技大学 信息基础科学系 2019/4/8 北京科技大学.
Name1..hour //加班時數 name2..hour //請假時數
Chapter 2 & Chapter 3.
C++语言程序设计 C++语言程序设计 第五章 函数 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C语言复习2----函数.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
第五节 并查集.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
物件導向程式設計 CH2.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++程式設計入門 變數與運算子 作者:黃建庭.
第二章 类型、对象、运算符和表达式.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
#include <iostream.h>
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
C++语言程序设计 第十章 C++标准模板库 成都信息工程学院计算机系.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
下列各句没有语病的一项是 A.布什政府在陷入伊战泥潭不能自拔的情况下,美国国会通过决议要求政府限期从伊拉克撤军。 B.自上世纪70年代开始,心脏病急剧上升,该病已成为威胁人类健康的主要杀手之一。 C.尊重事实,追求真理是专家的天职,任何违背科学真理的行为都应成为其禁区都不可踏入。 D.北京时间2007年9月14日,9时33分,日本第一颗绕月探测卫星“月亮女神”号在日本九州种子岛宇宙中心发射升空。
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
變數與資料型態  綠園.
資料!你家住哪裏? --談指標 綠園.
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
隨機函數.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

All Sources Shortest Path The Floyd-Warshall Algorithm 陳章裕 主講 高一資訊專題 2012.06.26

The Floyd-Warshall Algorithm Floyd-Warshall演算法,簡稱Floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為O(n^3)。我們平時所見的Floyd演算法的一般形式如下: 1 void Floyd(){ 2     int i,j,k; 3     for(k=1;k<=n;k++) 4         for(i=1;i<=n;i++) 5             for(j=1;j<=n;j++) 6                 if(d[i][k]+d[k][j]<d[i][j]) 7                     d[i][j]=d[i][k]+d[k][j]; 8 }

The Floyd-Warshall Algorithm 【說明範例】某王國有四個城市A, B, C, D,這些城市並非直接相通。例如下圖A城市可直接到C城市,但卻無法直接到B或D城市。城市之間可通行的情況及距離,如下圖所示。請問由C城市到A城市的最短距離? A B C D 3 2 7 1 6 A B C D 7 1 2 6 3 輸入: 4 0 0 3 0 2 0 0 0 0 7 0 1 6 0 0 0 輸出: 0 10 3 4 2 0 5 6 7 7 0 1 6 16 9 0

The Floyd-Warshall Algorithm void floyd_warshall() { int i, j, k; for (k = 0; k < n; ++k) for (i = 0; i < n; ++i) for (j = 0; j < n; ++j) // 如果i-k及k-j之間的路徑存在,且i,j 為不同節點 if ((d[i][k] * d[k][j] != 0) && (i != j)) if ((d[i][k]+d[k][j]<d[i][j]) ||(d[i][j]==0)) d[i][j] = d[i][k] + d[k][j]; }

The Floyd-Warshall Algorithm k i j d[i][j] d[i][k] + d[k][j] result 0 + 0 1 2 3 0 + 3 2 + 0 2 + 3 5 7 6 6 + 0 6 + 3 9 if ((d[i][k] * d[k][j] != 0) && (i != j))   //灰 if ((d[i][k]+d[k][j]<d[i][j]) ||(d[i][j]==0))//黑 d[i][j] = d[i][k] + d[k][j];     //紅 1 2 3 5 7 6 9 A B C D 7 1 2 6 3

The Floyd-Warshall Algorithm k i j d[i][j] d[i][k] + d[k][j] result 1 0 + 2 0 + 0 2 3 0 + 5 5 7 + 2 9 7 7 + 0 7 + 5 6 if ((d[i][k] * d[k][j] != 0) && (i != j))   //灰 if ((d[i][k]+d[k][j]<d[i][j]) ||(d[i][j]==0))//黑 d[i][j] = d[i][k] + d[k][j];     //紅 1 2 3 5 9 7 6 A B C D 7 1 2 6 3

The Floyd-Warshall Algorithm k i j d[i][j] d[i][k] + d[k][j] result 2 3 + 9 1 3 + 7 10 3 3 + 0 3 + 1 4 5 + 9 5 + 7 5 5 + 0 5 + 1 6 9 0 + 9 7 0 + 7 0 + 0 0 + 1 9 + 9 9 + 7 16 9 + 0 9 + 1 if ((d[i][k] * d[k][j] != 0) && (i != j))   //灰 if ((d[i][k]+d[k][j]<d[i][j]) ||(d[i][j]==0))//黑 d[i][j] = d[i][k] + d[k][j];     //紅 1 2 3 10 4 5 6 9 7 16 A B C D 7 1 2 6 3

The Floyd-Warshall Algorithm k i j d[i][j] d[i][k] + d[k][j] result 3 4 + 6 1 10 4 + 16 2 4 + 9 4 4 + 0 6 + 6 6 + 16 5 6 + 9 6 6 + 0 9 1 + 6 7 1 + 16 1 + 9 1 + 0 0 + 6 16 0 + 16 0 + 9 0 + 0 if ((d[i][k] * d[k][j] != 0) && (i != j))   //灰 if ((d[i][k]+d[k][j]<d[i][j]) ||(d[i][j]==0))//黑 d[i][j] = d[i][k] + d[k][j];     //紅 1 2 3 10 4 5 6 7 16 9 A B C D 7 1 2 6 3

The Floyd-Warshall Algorithm // floyd-warshall.cpp Floyd_Warshall Algorithm #include <iostream> using namespace std; int n; // 節點數 int d[16][16]; void floyd_warshall() { int i, j, k; for (k = 0; k < n; ++k) for (i = 0; i < n; ++i) for (j = 0; j < n; ++j) // 如果i-k及k-j之間的路徑存在,且i,j 為不同節點 if ((d[i][k] * d[k][j] != 0) && (i != j)) if ((d[i][k]+d[k][j]<d[i][j]) ||(d[i][j]==0)) d[i][j] = d[i][k] + d[k][j]; } int main() { int i, j; cin>>n; for (i = 0; i < n; ++i) for (j = 0; j < n; ++j) cin>>d[i][j]; floyd_warshall(); for (j = 0; j < n; ++j) cout.width(3); cout<<d[i][j]; } cout<<endl; system("pause"); return 0;

The Floyd-Warshall Algorithm 【zerojudge 範例】 // Zerojudge d908. 4. 最佳路徑 #include <iostream> #include<cstring> using namespace std; int n; int d[101][101]; void floyd_warshall() { int i, j, k; for (k = 0; k < n; ++k) for (i = 0; i < n; ++i) for (j = 0; j < n; ++j) if ((d[i][k] * d[k][j] != 0) && (i != j)) if ((d[i][k]+d[k][j]>d[i][j]) ) d[i][j] = d[i][k] + d[k][j]; } int main() { char c; int i, j; while(cin>>c>>n) int w,m=0; char a ,b; memset(d,0,sizeof(d)); for (i = 0; i < n; ++i) cin>>a>>b>>w; if(w > d[a-'A'][b-'A']) d[a-'A'][b-'A']=w; } floyd_warshall(); for (j = 0; j < n; ++j) m=(m>d[c-'A'][j])?m:d[c-'A'][j]; cout<<m<<endl; //system("pause"); return 0;

【zerojudge 練習】 b017 E. 漢米頓的麻煩 b029 D. 水之都 d282 Q11015: 05-2 Rendezvous d335  10009 - All Roads Lead Where? d792  11463 - Commandos d908  4. 最佳路徑