voidfloyd(vector<vector<int> >& g, vector<vector<int> >& dp, int n){ vector<vector<int> >path(n+1, vector<int>(n+1, 0)); for (int i=1; i<=n; ++i) { for (int j=1; j<=n; ++j) { dp[i][j] = g[i][j]; if (i != j && dp[i][j] < MAXL) { path[i][j] = i; } else { path[i][j] = -1; } } } for (int k=1; k<=n; ++k) { for (int i=1; i<=n; ++i) { for (int j=1; j<=n; ++j) { if (dp[i][j] > dp[i][k] + dp[k][j]) { dp[i][j] = dp[i][k] + dp[k][j]; path[i][j] = path[k][j]; } } } } }
voidupdate(vector<vector<int> >& g, vector<vector<int> >& edges, vector<vector<int> >& dp, int n, int i, int w){ auto& e = edges[i]; g[e[0]][e[1]] = w; floyd(g, dp, n); }
intmain(){ int n, q; cin >> n >> q; vector<vector<int> > g(n+1, vector<int>(n+1, MAXL)); vector<vector<int> > dp(n+1, vector<int>(n+1, MAXL)); vector<vector<int> > edges(n*2, vector<int>(3)); for (int i=0; i<2*n-2; ++ i) { int u, v, w; cin >> u >> v >> w; edges[i+1] = {u, v, w}; g[u][v] = min(g[u][v], w); } floyd(g, dp, n); while (q--) { int op, x, y; cin >> op >> x >> y; if (op == 1) { // update update(g, edges, dp, n, x, y); } elseif (op == 2) { // query cout << dp[x][y] << endl; } } return0; }