hdoj1874
分析:
一看題目, 就是求最短路, 這道題用的是dijkstra+優先佇列。先說一下dijkstra演算法:每次擴充套件乙個距離最短的節點, 更新與其相鄰點的距離。 當所有邊權都為正時, 由於不會存在乙個距離更短的沒有擴充套件的點,所以這個點的距離不會在改變, 保證了演算法的正確性。
演算法步驟如下:
g= 1. 初始時令 s=,t=v-s=,t中頂點對應的距離值
若存在〈v0,v〉,d(v0,vi)為〈v0,vi〉弧上的權值
若不存在〈v0,vi〉,d(v0,vi)為∞
2. 從t中選取乙個與s中頂點有關聯邊且權值最小的頂點w,加入到s中
3. 對其餘t中頂點的距離值進行修改:若加進w作中間頂點,從v0到vi的距離值縮短,則修改此距離值
重複上述步驟2、3,直到s中包含所有頂點,即w=vi為止。
偽**:
將所有節點狀態初始化(標記為未計算)
設起始點s, d[s] = 0; 其他節點d[i] = max;
迴圈n次
對應**:
memset(v, 0, sizeof程式的複雜度為n方, 每一次都要求所有d中的最小值。 然而stl中的優先佇列priority_queue正好解決了這一問題。(v));
for(int i = 0; i < n; i++)
d[i] =10e8;
d[s] = 0
;for(int i = 1; i < n; i++)
}
#include#includeview code#include
#include
#include
#include
#include
using
namespace
std;
int n, m, s, t, v[1005
];double d[1005
];struct
edge
e[1005
];struct node//
儲存點的資訊, 起始點到x節點的最短距離d.
no[1005
];bool
operator
vector
vec[1005
];double ac(int
x) }
}return -1;}
intmain()
scanf(
"%d%d
", &s, &t);
d[s] = 0
;
double ans =ac(s);
if(ans == -1
) printf(
"-1\n");
else
printf(
"%.0lf\n
", ans);
}return0;
}
hdoj1874 暢通工程續
dijsktra演算法 偽 清除所有標記 d 0 0,其他d i intmax for 1到n dijkstra演算法的應用 include using namespace std const int max 201 const int intmax 10000000 int map max max...
HDOJ 1874 最短路問題
題目大意 輸入n,m,分別表示有編號 0 n 1 n個城鎮和m調街道,接下來輸入m條道路及其所花費的時間,之後輸入起點和終點,最後求出從起點到終點所花費的最短時間。演算法思想 迪傑斯特拉演算法 1.根據輸入資訊建立鄰接矩陣,為無向圖。此處需要注意會有道路覆蓋的問題,此時應用花費時間最小的道路。2.用...
HDOJ1874 暢通工程續
題目鏈結 求單源最短路的題,因為邊權非負,所以可以用dijkstra。這題有一點需要注意的地方是有重邊,在讀資料時取較小的即可。view code 1 include 2 include 3 define min a,b a 4 define n 200 5 define inf 2000000 6...