Bellman-Ford
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x7f;
class Edge {
public:
int u;
int v;
int w;
Edge() {
}
};
int n;
int m;
int u;
int v;
int w;
vector<Edge*> elist;
vector<int> dist;
vector<int> path;
bool bellman_ford(int u) {
dist.resize(n, INF);
dist[u] = 0;
path.resize(n, -1);
for (int i = 1; i < n; i++) {
bool flag = 0;
for (int j = 0; j < m; j++) {
if (dist[elist[j]->v] > dist[elist[j]->u] + elist[j]->w) {
dist[elist[j]->v] = dist[elist[j]->u] + elist[j]->w;
path[elist[j]->v] = elist[j]->u;
flag = true;
}
}
if (!flag) {
return false;
}
}
for (int j = 0; j < m; j++) {
if (dist[elist[j]->v] > dist[elist[j]->u] + elist[j]->w) {
dist[elist[j]->v] = dist[elist[j]->u] + elist[j]->w;
return true;
}
}
return false;
}
void init() {
ifstream infile("in.txt", ios::in);
if (!infile.is_open()) {
cout << "fail" << endl;
}
infile >> n >> m;
for (int i = 0; i < m; i++) {
infile >> u >> v >> w;
Edge* e = new Edge();
e->u = u;
e->v = v;
e->w = w;
elist.push_back(e);
}
}
void print(int s, int flag) {
ofstream outfile("out.txt", ios::out);
outfile << " Bellman-Ford 算法 " << endl;
if (flag) {
outfile << "有负环存在" << endl;
return;
}
outfile << "-----源点 "<< s <<" 到各点的最短路径长度-----" << endl;
for (int i = 0; i < n; i++) {
outfile << "源点 "<< s <<" 到 " << 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 = to_string(s) + way;
outfile << "源点 "<< s <<" 到 " << i << "点的最短路径路线为:" << way << endl;
}
outfile.close();
}
int main() {
init();
int s = 0;
bool flag = bellman_ford(s);
print(s, flag);
return 0;
}