最短路径
解题思路
Dijkstra (单源最短路径)
const int INF = INT_MAX;
int n;
int m;
int u;
int v;
int w;
vector<vector<int> > graph;
vector<int> dist;
vector<bool> vis;
vector<int> path;
void Dijkstra(vector<vector<int> > graph, int u) {
for (int i = 0; i < n; i++) {
dist[i] = graph[u][i];
vis[i] = false;
if (dist[i] == INF) {
path[i] = -1;
} else {
path[i] = u;
}
}
dist[u] = 0;
vis[u] = true;
for (int i = 0; i < n; i++) {
int temp = INF;
int t = u;
for (int j = 0; j < n; j++) {
if (!vis[j] && dist[j] < temp) {
temp = dist[j];
t = j;
}
}
if (u == t) return;
vis[t] = true;
for (int j = 0; j < n; j++) {
if (graph[t][j] < INF && !vis[j] && (dist[t] + graph[t][j] < dist[j])) {
dist[j] = dist[t] + graph[t][j];
path[j] = t;
}
}
}
}
int main() {
ifstream infile("in.txt", ios::in);
ofstream outfile("out.txt", ios::out);
infile >> n >> m;
graph.resize(n, vector<int> (n, INF));
dist.resize(n);
vis.resize(n);
path.resize(n);
for (int i = 0; i < m; i++) {
infile >> u >> v >> w;
graph[u][v] = w;
}
Dijkstra(graph, 0);
outfile << "-----源点 0 到各点的最短路径长度-----" << endl;
for (int i = 0; i < n; i++) {
outfile << "源点 0 到 " << i << "点的最短距离为:" << dist[i] << endl;
}
outfile << endl << "--------最短路径路线--------" << endl;
for (int i = 0; i < n; i++) {
int k = i;
string way = "";
while (path[k] != -1) {
way = "-->" + to_string(k) + way;
k = path[k];
}
way = "0" + way;
outfile << "源点 0 到 " << i << "点的最短路径路线为:" << way << endl;
}
}