Dijkstra算法:
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 int N, M, S, T; 9 vector > m(1001, vector (1001));10 vector dist(1001);11 vector s(1001);12 13 void solve() {14 dist.assign(N+1, INT_MAX);15 s.assign(N+1, false);16 for (int i = 1; i <= N; ++i) {17 dist[i] = m[S][i];18 }19 dist[S] = 0; s[S] = true;20 for (int i = 1; i <= N; ++i) {21 int tmp_min = INT_MAX;22 int u = S;23 //从未用过的点中找到距离最小的点24 for (int j = 1; j <= N; ++j) {25 if (!s[j] && dist[j] < tmp_min) {26 u = j;27 tmp_min = dist[j];28 }29 }30 s[u] = true;31 //更新距离32 for (int j = 1; j <= N; ++j) {33 if (!s[j] && m[u][j] < INT_MAX) {34 dist[j] = min(dist[j], dist[u]+m[u][j]);35 }36 }37 }38 cout << dist[T] << endl;39 }40 41 int main() {42 while (cin >> N >> M >> S >> T) {43 int u, v, len;44 for (int i = 1; i <= N; ++i)45 m[i].assign(N+1, INT_MAX);46 for (int i = 0; i < M; ++i) {47 cin >> u >> v >> len;48 m[u][v] = m[v][u] = min(m[u][v], len);49 }50 solve();51 }52 return 0;53 }
Dijkstra算法堆优化:
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int INF = 1e9; 8 9 struct edge {10 int idx;11 int dist;12 edge(int _idx, int _dist) : idx(_idx), dist(_dist) {}13 };14 15 struct cmp {16 bool operator () (const edge &a, const edge &b) { return a.dist > b.dist; }17 };18 19 int N, M, S, T;20 vector > graph;21 22 void solve() {23 priority_queue , cmp> heap;24 vector dist(N + 1, INF);25 vector visit(N + 1, false);26 dist[S] = 0;27 visit[S] = true;28 for (int i = 0; i < graph[S].size(); ++i) {29 auto v = graph[S][i];30 dist[v.idx] = min(dist[v.idx], v.dist);31 heap.push(edge(v.idx, dist[v.idx]));32 }33 while (!heap.empty()) {34 auto u = heap.top();35 heap.pop();36 if (u.idx == T) {37 cout << u.dist << endl;38 return;39 }40 if (visit[u.idx]) continue;41 visit[u.idx] = true;42 for (int i = 0; i < graph[u.idx].size(); ++i) {43 auto v = graph[u.idx][i];44 if (!visit[v.idx] && dist[v.idx] > dist[u.idx] + v.dist) {45 dist[v.idx] = dist[u.idx] + v.dist;46 heap.push(edge(v.idx, dist[v.idx]));47 }48 }49 }50 cout << "-1" << endl;51 }52 53 int main() {54 while (cin >> N >> M >> S >> T) {55 int u, v, len;56 graph.resize(N + 1);57 for (int i = 0; i < M; ++i) {58 cin >> u >> v >> len;59 graph[u].push_back(edge(v, len));60 graph[v].push_back(edge(u, len));61 }62 solve();63 }64 return 0;65 }
SPFA算法:
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 const int INF = 1e9; 9 10 struct node {11 int idx;12 int len;13 node(int _idx = 0, int _len = 0) : idx(_idx), len(_len){}14 };15 16 int N, M, S, T;17 vector > graph;18 vector dist;19 20 void solve() {21 vector visit(N+1, false);22 //priority_queue