NenTang.vn |
Chương 2-Bài 20. Lab 5 - Tìm đường đi ngắn nhất từ đỉnh S đến tất cả các đỉnh còn lại trên đồ thị (sử dụng thuật toán Dijkstra) |
||
Tác giả: Dương Nguyễn Phú Cường | Ngày đăng: 6/4/2025, 17:7 | Lượt xem: 685 |
Đề bàiCho đồ thị có hướng có trọng số không âm G=<V,E> được biểu diễn dưới dạng danh sách cạnh trọng số. Hãy viết chương trình tìm đường đi ngắn nhất từ đỉnh S đến tất cả các đỉnh còn lại trên đồ thị. Dữ liệu đảm bảo có đường đi từ đỉnh S tới mọi đỉnh khác trên đồ thị.Input
Output
Sample 1
Sample 2
Giải
#include<bits/stdc++.h> #include<iostream> using namespace std; using ll = long long; const int maxN = 100001; const int INF = 1e9; // so vo cung int n, m; // n: so dinh, m: so canh int s; // dinh bat dau vector<pair<int, int>> adj[maxN]; // vector luu tru canh co trong so void inp() { cin >> n >> m >> s; for(int i = 0; i < m; i++) { int x, y, w; // canh x -> y co trong so w cin >> x >> y >> w; adj[x].push_back({y, w}); // Do thi co huong thi comment dong code sau //adj[y].push_back({x, w}); } } void dijkstra(int s) { // Mang luu khoang cach duong di vector<ll> d(n+1, INF); d[s] = 0; // Hang doi uu tien // {khoang_cach, dinh} priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q; Q.push({0, s}); // Khoi tao while(!Q.empty()) { // Chon ra dinh co khoang cach tu s nho nhat pair<int, int> top = Q.top(); Q.pop(); int u = top.second; int kc = top.first; if(kc > d[u]) continue; // Relaxation: cap nhat khoang cach tu s cho toi moi dinh ke voi u for(auto it: adj[u]) { int v = it.first; int w = it.second; if(d[v] > d[u] + w) { d[v] = d[u] + w; Q.push({d[v], v}); } } } for(int i = 1; i <= n; i++) { cout << d[i] << ' '; } } int main() { // Chuyen NHAP, XUAT thanh file freopen("lab_5_input.INP", "r", stdin); freopen("lab_5_output.OUT", "w", stdout); // INPUT inp(); // OUTPUT dijkstra(s); } #include<bits/stdc++.h>
#include<iostream>
using namespace std;
using ll = long long;
const int maxN = 100001;
const int INF = 1e9; // so vo cung
int n, m; // n: so dinh, m: so canh
int s; // dinh bat dau
vector<pair<int, int>> adj[maxN]; // vector luu tru canh co trong so
void inp() {
cin >> n >> m >> s;
for(int i = 0; i < m; i++) {
int x, y, w; // canh x -> y co trong so w
cin >> x >> y >> w;
adj[x].push_back({y, w});
// Do thi co huong thi comment dong code sau
//adj[y].push_back({x, w});
}
}
void dijkstra(int s) {
// Mang luu khoang cach duong di
vector<ll> d(n+1, INF);
d[s] = 0;
// Hang doi uu tien
// {khoang_cach, dinh}
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q;
Q.push({0, s}); // Khoi tao
while(!Q.empty()) {
// Chon ra dinh co khoang cach tu s nho nhat
pair<int, int> top = Q.top();
Q.pop();
int u = top.second;
int kc = top.first;
if(kc > d[u])
continue;
// Relaxation: cap nhat khoang cach tu s cho toi moi dinh ke voi u
for(auto it: adj[u]) {
int v = it.first;
int w = it.second;
if(d[v] > d[u] + w) {
d[v] = d[u] + w;
Q.push({d[v], v});
}
}
}
for(int i = 1; i <= n; i++) {
cout << d[i] << ' ';
}
}
int main() {
// Chuyen NHAP, XUAT thanh file
freopen("lab_5_input.INP", "r", stdin);
freopen("lab_5_output.OUT", "w", stdout);
// INPUT
inp();
// OUTPUT
dijkstra(s);
} #include<bits/stdc++.h> #include<iostream> using namespace std; using ll = long long; const int maxN = 100001; const int INF = 1e9; // so vo cung int n, m; // n: so dinh, m: so canh int s; // dinh bat dau vector<pair<int, int>> adj[maxN]; // vector luu tru canh co trong so void inp() { cin >> n >> m >> s; for(int i = 0; i < m; i++) { int x, y, w; // canh x -> y co trong so w cin >> x >> y >> w; adj[x].push_back({y, w}); // Do thi co huong thi comment dong code sau //adj[y].push_back({x, w}); } } void dijkstra(int s) { // Mang luu khoang cach duong di vector<ll> d(n+1, INF); d[s] = 0; // Hang doi uu tien // {khoang_cach, dinh} priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q; Q.push({0, s}); // Khoi tao while(!Q.empty()) { // Chon ra dinh co khoang cach tu s nho nhat pair<int, int> top = Q.top(); Q.pop(); int u = top.second; int kc = top.first; if(kc > d[u]) continue; // Relaxation: cap nhat khoang cach tu s cho toi moi dinh ke voi u for(auto it: adj[u]) { int v = it.first; int w = it.second; if(d[v] > d[u] + w) { d[v] = d[u] + w; Q.push({d[v], v}); } } } for(int i = 1; i <= n; i++) { cout << d[i] << ' '; } } int main() { // Chuyen NHAP, XUAT thanh file freopen("lab_5_input.INP", "r", stdin); freopen("lab_5_output.OUT", "w", stdout); // INPUT inp(); // OUTPUT dijkstra(s); } |
Sản phẩm của Nền tảng | NenTang.vn - Hành trang tới Tương lai |