普通
int n, m; // 节点和边数
int d[100]; // 最短距离
int u[100], v[100], w[100]; // idx为边
void read(){
cin >> n >> m;
for(int e = 0; e < m; e++){
cin >> u[e] >> v[e] >> w[e];
}
}
void bellman_ford(){
for(int i = 0; i < n; i++){
d[i] = INF;
}
d[0] = 0;
for(int k = 0; k < n - 1; k++){
for(int e = 0; e < m; e++){
int x = u[e], y = v[e], z = w[e];
if(d[x] < INF && d[x] + w[e] < d[y]){
d[y] = d[x] + w[e];
}
}
}
}
效率高
int n, m; // 顶点数和边数
int first[100];
int u[100], v[100], w[100], _next[100];
int d[100];
void read(){
cin >> n >> m;
for(int i = 0; i < n; i++)
first[i] = -1;
for(int e = 0; e < m; e++){
cin >> u[e] >> v[e] >> w[e];
_next[e] = first[u[e]];
first[u[e]] = e;
}
}
void bellman_ford(){
queue<int> q;
bool inq[100]; // 在队列里
memset(inq, 0, sizeof(inq));
for(int i = 0; i < n; i++){
d[i] = INF;
}
d[0] = 0;
q.push(0);
while(!q.empty()){
int x = q.front();
q.pop();
inq[x] = false;
for(int e = first[x]; e != -1; e = _next[e]){
int y = v[e], z = w[e];
if(d[x] + w[e] < d[y]){
d[y] = d[x] + w[e];
if(!inq[y]){ // 不在队列里就进队
inq[y] = true;
q.push(y);
}
}
}
}
}