题意:


思路:

https://ac.nowcoder.com/discuss/151522?type=101&order=0&pos=1&page=0&channel=666&source_id=discuss_tag
















#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
const int M = 1e6 + 10;
const int N = 1e3 + 10;
typedef long long ll;
const ll inf = 1e18;
struct Edge{
    int u,to,w,nex;
}e[M];
int head[N],idx;
int n,m;

void add_edge(int u,int v,int w){
    e[idx].u = u;
    e[idx].to = v;
    e[idx].w = w;
    e[idx].nex = head[u];
    head[u] = idx++;
}
ll dist[N];
bool in[N];
void spfa(int S){
    for(int i = 0;i <= n;i++){
        dist[i] = inf,in[i] = 0;
    }
    queue<int> q;
    dist[S] = 0;
    q.push(S);
    while(q.size()){
        int u = q.front();q.pop();
        in[u] = 0;
        for(int i = head[u];~i;i = e[i].nex){
            int v = e[i].to,w = e[i].w;
            if(dist[v] > dist[u] + w){
                dist[v] = dist[u] + w;
                if(!in[v]){
                    q.push(v);
                    in[v] = 1;
                }
            }
        }
    }
}
int main(){
    memset(head,-1,sizeof(head));
    scanf("%d%d",&n,&m);
    for(int i = 1,u,v,w;i <= m;i++){
        scanf("%d%d%d",&u,&v,&w);
        add_edge(u,v,w);
    }
    for(int i = 1;i <= n;i++) add_edge(0,i,0);
    spfa(0);
    for(int i = 0,u,v,w;i < m;i++){
        u = e[i].u,v = e[i].to,w = e[i].w;
        printf("%d %d %lld\n",u,v,dist[u] - dist[v] + w);
    }
    return 0;
}