#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define vll vector #define vvvl vector #define vvl vector> #define VV(a, b, c, d) vector>(a, vector(b, c)) #define VVV(a, b, c, d) vector(a, vvl(b, vll (c, d))); #define re(c, b) for(ll c=0;c> mincost_cycle(vector> &G, bool undirected){ int n = G.size(); ll INF = numeric_limits::max(), ans = INF; vector min_cycle; vector dist(n); vector pre(n); for(int i=0;i; priority_queue, greater

> q; q.push({0, i}); int idx = -1; while(!q.empty()){ p p_now = q.top(); q.pop(); int v = p_now.second; if(dist[v] == INF || dist[v] < p_now.first || ans <= dist[v]) continue; for(edge &e:G[v]){ if(undirected) if(pre[v] != nullptr && pre[v]->idx == e.idx) continue; if(e.to==i && dist[v] + e.w < ans){ ans = dist[v] + e.w; idx = v; pre[i] = &e; continue; } if(e.to dist[v] + e.w){ dist[e.to] = dist[v] + e.w; pre[e.to] = &e; q.push(p(dist[e.to], e.to)); } } } if(undirected){ edge *ud = nullptr; for(int j=i+1;jidx == e.idx) || (pre[e.from] && pre[e.from]->idx == e.idx)) continue; if(ans > dist[e.from] + dist[e.to] + e.w){ ans = dist[e.from] + dist[e.to] + e.w; ud = &e; } } } if(ud){ vector left{ud}; int tmp = ud->from; while(pre[tmp]&&tmp!=i){ left.push_back(pre[tmp]); tmp = pre[tmp]->from; } reverse(left.begin(), left.end()); tmp = ud->to; while(pre[tmp]&&tmp!=i){ assert(pre[tmp]); left.push_back(pre[tmp]); tmp = pre[tmp]->from; } min_cycle = left; } } if(idx != -1){ vector lis; idx = i; while(pre[idx]){ lis.push_back(pre[idx]); int k = pre[idx]->from; pre[idx] = nullptr; idx = k; } reverse(lis.begin(), lis.end()); min_cycle = lis; } } return {ans, min_cycle}; } int main(){ int t;scanf("%d", &t); int n, m;scanf("%d %d", &n, &m); vector> G(n); for(int i=0;i