演算法分析第二次作業

2022-07-03 04:15:10 字數 2308 閱讀 2159

1、問題

已知乙個有向圖或無向圖,其中的邊有權值,詢問點到點的最短距離

最短路問題

2、解析

floyd可以求圖中所有點到其他點的最短路,運用動態規劃的思想。任意節點i到j的最短路徑兩種可能:

1、直接從i到j。

2、從i經過若干個節點k到j。

dis[i][j]表示節點i到j最短路徑的距離,對於每乙個節點k,檢查dis[i][k] + dis[k][j]小於dis[i][j],如果成立,dis[i][j] = dis[i][k] + dis[k][j];遍歷每個k,每次更新的是除第k行和第k列的數。

dijkstra可以求單源最短路,即乙個起始點到其他點的最短距離,運用貪心的思想。每次選擇到起始點最短距離的點,用來更新其他點到起始點的距離,重複此操作,每次選擇沒被選過的點中到起始點最短距離的點來更新,直到所有可以到達起始點的點都被選完。

3、設計

floyd演算法:

/*4 8

1 2 2

1 3 6

1 4 4

2 3 3

3 1 7

3 4 1

4 1 5

4 3 12

*/int len[1010][1001];

void floyd()

} }for (int i = 1; i <= n; ++i) }}

signed main()

len[i][i] = 0;

} for (int i = 0; i < m; ++i)

floyd();

return 0;

}dijkstra演算法:

/*8 11

a b 1

b d 2

c a 2

d c 1

d f 8

e d 2

e g 2

f e 2

g f 3

g h 3

h f 2

*/const int maxn = 1e5 + 10;

int head[maxn];

int to[maxn], nxt[maxn], val[maxn];

int ecnt = 0;

void add(int u, int v, int w)

int dis[maxn];

bool vis[maxn];

int n, m;

void dijkstra(int s)

} if (k == -1) break;

vis[k] = 1;

for (int i = head[k]; i; i = nxt[i]) }}

signed main()

int s = 'a' - 'a';

dijkstra(s);

printf("a - h 的距離為:%d\n", dis[int('h' - 'a')]);

}

4、分析

floyd三重迴圈,複雜度為o(n^3)

dijkstra兩重迴圈,複雜度為o(n^2)

用floyd演算法求解下圖各個頂點的最短距離。寫出floyd演算法的偽**和給出距離矩陣(頂點之間的最短距離矩陣),

使用dijkstra演算法求由頂點a到頂點h的最短路徑

5、原始碼

course assignment

第二次作業 APP分析

第一部分 調研,評測 上圖 2.存在的bug。3.bug的描述。4.選擇乙個朋友 使用者 進行採訪,並加以記載。4.1.介紹採訪物件的背景和需求。4.2.讓採訪物件使用該產品的功能。4.3.描述使用者使用這個產品的過程,使用者的問題解決了麼?軟體在資料量 介面 功能 準確度上各有什麼優缺點?使用者體...

第二次作業

execise02 1.查詢85年以後出生的學生姓名 性別和出生日期 2.列表顯示所有可能的學生選課組合 學號 課程號 3.查詢1 2 4班中陳姓同學的資訊 4.查詢所有及格的學生姓名 所選課程名及所得分數 5.統計各門課程的及格人數 課程編號 課程名 及格人數 6.統計各門課程的總人數 及格人數和...

第二次作業

第一題 p1 1 遞迴寫法,效率低 include 1.寫乙個函式返回引數值為1的個數 比如 15 0000 1111 4個1 程式原型 int count one bits unsigned int value int fuc int x else return 0 void mainp1 p1 ...