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 ...