structEdge { int v; ll w; }; vector<Edge> adj[maxn];
structState { int u; ll d; booloperator < ( const State &oth ) const { return d > oth.d; } };
ll dis[maxn], cnt[maxn];
voiddijkstra( int S, int N ){ for( int i = 1; i <= N; ++ i ) dis[i] = inf; priority_queue<State> pq; pq.push({ S, 0 }); dis[S] = 0, cnt[S] = 1; while( !pq.empty( ) ) { auto [u, d] = pq.top( ); pq.pop( ); if( d > dis[u] ) continue; for( auto [v, w] : adj[u] ) { ll dist = d + w; if( dist < dis[v] ) { dis[v] = dist; cnt[v] = cnt[u]; pq.push({ v, dis[v] }); } elseif( dist == dis[v] ) { cnt[v] = ( cnt[v] + cnt[u] ) % mod; } } } }
voidsolve( ){ int n = read( ), m = read( ); for( int i = 1; i <= m; ++ i ) { int u = read( ), v = read( ); adj[u].push_back({ v, 1 }); adj[v].push_back({ u, 1 }); } dijkstra( 1, n ); for( int i = 1; i <= n; ++ i ) cout << cnt[i] << '\n'; }
structEdge { int v, w, id; }; vector<Edge> adj[maxn]; structEdge1 { int v, w; }; vector<Edge1> tadj[maxn];
structState { int u; ll d; booloperator < ( const State &oth ) const { return d > oth.d; } };
ll dis[maxn]; PII pre[maxn]; // 分别存 { 前驱点 和 前驱边 }
voiddijkstra( int S, int N ){ for( int i = 1; i <= N; ++ i ) dis[i] = inf; priority_queue<State> pq; pq.push({ S, 0 }); dis[S] = 0; while( !pq.empty( ) ) { auto [u, d] = pq.top( ); pq.pop( ); if( d > dis[u] ) continue; for( auto [v, w, id] : adj[u] ) { if( d + w < dis[v] ) { pre[v] = { u, id }; dis[v] = d + w; pq.push({ v, dis[v] }); } } } }
voidbuild( int N ){ for( int i = 2; i <= N; ++ i ) { auto [u, id] = pre[i]; tadj[u].push_back({ i, id }); } }
voidbfs( int S, int K ){ vector<int> res; queue<int> q; q.push( S ); while( !q.empty( ) && res.size( ) < K ) { int u = q.front( ); q.pop( ); for( auto [v, id] : tadj[u] ) { if( res.size( ) >= K ) break; res.push_back( id ); q.push( v ); } } cout << res.size( ) << '\n'; for( int x : res ) cout << x << " "; cout << '\n'; }
voidsolve( ){ int n = read( ), m = read( ), k = read( ); k = min( n - 1, k );
for( int i = 1; i <= m; ++ i ) { int u = read( ), v = read( ), w = read( ); adj[u].push_back({ v, w, i }); adj[v].push_back({ u, w, i }); }
structEdge { int v; ll w; }; vector<Edge> adj[maxn];
structState { int u; ll d; booloperator < ( const State &oth ) const { return d > oth.d; } };
ll dis1[maxn], dis2[maxn];
voiddijkstra( int S, int N ){ for( int i = 1; i <= N; ++ i ) dis1[i] = dis2[i] = inf; priority_queue<State> pq; pq.push({ S, 0 }); dis1[S] = 0; while( !pq.empty( ) ) { auto [u, d] = pq.top( ); pq.pop( ); if( d > dis2[u] ) continue; for( auto [v, w] : adj[u] ) { ll dist = d + w; if( dist < dis1[v] ) { dis2[v] = dis1[v]; dis1[v] = dist; pq.push({ v, dist }); } elseif( dis1[v] < dist && dist < dis2[v] ) { dis2[v] = dist; pq.push({ v, dist }); } } } }
voidsolve( ){ int n = read( ), m = read( ); for( int i = 1; i <= m; ++ i ) { int u = read( ), v = read( ); ll w = read( ); adj[u].push_back({ v, w }); adj[v].push_back({ u, w }); } dijkstra( 1, n ); cout << dis2[n] << '\n'; }
structEdge { int v; ll w; }; vector<Edge> adj[maxn]; int deg[maxn]; bool g[maxn][maxn];
structState { int u; ll d; booloperator < ( const State &oth ) const { return d > oth.d; } };
ll dis1[maxn], dis2[maxn];
voiddijkstra( int S, int N, int K ){ for( int i = 1; i <= N; ++ i ) dis1[i] = dis2[i] = inf; priority_queue<State> pq; pq.push({ S, 0 }); dis1[S] = 0; while( !pq.empty( ) ) { auto [u, d] = pq.top( ); pq.pop( ); if( d > dis2[u] ) continue; for( auto [v, w] : adj[u] ) { if( v != 1 && v != N && deg[v] < K ) continue; ll dist = d + w; if( dist < dis1[v] ) { dis2[v] = dis1[v]; dis1[v] = dist; pq.push({ v, dist }); } elseif( dis1[v] < dist && dist < dis2[v] ) { dis2[v] = dist; pq.push({ v, dist }); } } } }
voidsolve( ){ int n = read( ), m = read( ), k = read( ); for( int i = 1; i <= m; ++ i ) { int u = read( ), v = read( ); ll w = read( ); adj[u].push_back({ v, w }); adj[v].push_back({ u, w }); if( !g[u][v] ) { g[u][v] = g[v][u] = 1; deg[u] ++; deg[v] ++; } } dijkstra( 1, n, k ); if( dis2[n] == inf ) cout << "-1\n"; else cout << dis2[n] << '\n'; }
structEdge { int v; ll w; }; vector<Edge> adj[maxn];
ll dis[maxn][maxk]; structState { int u, k; ll d; booloperator < ( const State &oth ) const { return d > oth.d; } };
voiddijkstra( int S, int N, int K ){ for( int i = 1; i <= N; ++ i ) { for( int j = 0; j <= K; ++ j ) { dis[i][j] = inf; } } priority_queue<State> q; dis[S][0] = 0, q.push( { S, 0, 0 } ); while( !q.empty( ) ) { auto [u, k, d] = q.top( ); q.pop( ); if( d > dis[u][k] ) continue; for( auto [v, w] : adj[u] ) { if( k < K && dis[v][k+1] > dis[u][k] ) { dis[v][k+1] = dis[u][k]; q.push({ v, k+1, dis[v][k+1] }); } // 使用免费资格 if( dis[v][k] > dis[u][k] + w ) { dis[v][k] = dis[u][k] + w; q.push({ v, k, dis[v][k] }); } // 不使用免费资格 } } }
voidsolve( ){ int n = read( ), m = read( ), k = read( ); int s = read( ) + 1, t = read( ) + 1; for( int i = 1; i <= m; ++ i ) { int u = read( ) + 1, v = read( ) + 1; ll w = read( ); adj[u].push_back({ v, w }); adj[v].push_back({ u, w }); } dijkstra( s, n, k ); ll ans = inf; for( int j = 0; j <= k; ++ j ) ans = min( ans, dis[t][j] ); cout << ans << '\n'; }
structEdge { int v, w, need; }; vector<Edge> adj[maxn];
structState { int d, u, mask; booloperator < ( const State &oth ) const { return d > oth.d; } };
int dis[maxn][1 << maxp]; int sword[maxn];
voiddijkstra( int S, int N, int P ){ for( int i = 1; i <= N; ++ i ) { for( int j = 0; j < ( 1 << P ); ++ j ) { dis[i][j] = inf; } } int start = sword[S]; dis[S][start] = 0; priority_queue<State> pq; pq.push( { 0, S, start } ); while( !pq.empty( ) ) { auto [d, u, mask] = pq.top( ); pq.pop( ); if( d > dis[u][mask] ) continue; for( auto [v, w, need] : adj[u] ) { if( ( mask & need ) != need ) continue; int nxt_mask = mask | sword[v]; if( dis[v][nxt_mask] > d + w ) { dis[v][nxt_mask] = d + w; pq.push({ dis[v][nxt_mask], v, nxt_mask }); } } } }
voidsolve( ){ int n = read( ), m = read( ), p = read( ), k = read( );
for( int i = 1; i <= k; ++ i ) { int w = read( ), qi = read( ); int mask = 0; for( int j = 1; j <= qi; ++ j ) { int rj = read( ); mask |= ( 1 << (rj - 1) ); } sword[w] |= mask; }
for( int i = 1; i <= m; ++ i ) { int u = read( ), v = read( ), w = read( ), si = read( ); int mask = 0; for( int j = 1; j <= si; ++ j ) { int uj = read( ); mask |= ( 1 << (uj - 1) ); } adj[u].pb( { v, w, mask } ); adj[v].pb( { u, w, mask } ); }
dijkstra( 1, n, p ); int ans = inf; for( int mask = 0; mask < ( 1 << p ); ++ mask ) { ans = min( ans, dis[n][mask] ); } if( ans == inf ) cout << -1 << '\n'; else cout << ans << '\n'; }
voidsolve( ){ int n = read( ), m = read( ); for( int i = 1; i <= n; ++ i ) { a[i] = read( ); adj[i].pb({ i + n, -a[i] }); adj[i + n].pb({ i + 2 * n, a[i] }); } for( int i = 1; i <= m; ++ i ) { int x = read( ), y = read( ), z = read( ); adj[x].pb({ y, 0 }); adj[x + n].pb({ y + n, 0 }); adj[x + 2 * n].pb({ y + 2 * n, 0 }); if( z == 2 ) { // 双向边的情况 adj[y].pb({ x, 0 }); adj[y + n].pb({ x + n, 0 }); adj[y + 2 * n].pb({ x + 2 * n, 0 }); } } spfa( 1, n ); cout << max( 0LL, dis[n * 3] ) << '\n'; }
structState { int u; ll d; booloperator < ( const State &oth ) const { return d > oth.d; } };
ll dis[maxn];
voiddijkstra( int S, int mod ){ for( int i = 0; i < mod; ++ i ) dis[i] = inf; priority_queue<State> pq; pq.push({ S, 0 }); dis[S] = 0; while( !pq.empty( ) ) { auto [u, d] = pq.top( ); pq.pop( ); if( d > dis[u] ) continue; for( auto [v, w] : adj[u] ) { if( d + w < dis[v] ) { dis[v] = d + w; pq.push({ v, dis[v] }); } } } }
voidsolve( ){ ll h = read( ); int x = read( ), y = read( ), z = read( ); int mod = min({ x, y, z }); h = h - 1; for( int i = 0; i < mod; ++ i ) { adj[i].push_back({ (i + x) % mod, x }); adj[i].push_back({ (i + y) % mod, y }); adj[i].push_back({ (i + z) % mod, z }); } dijkstra( 0, mod ); ll ans = 0; for( int i = 0; i < mod; ++ i ) { if( h >= dis[i] ) ans += 1ll * ( h - dis[i] ) / mod + 1; } cout << ans << '\n'; }