1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| #include<bits/stdc++.h> using namespace std; using ll = long long; using PII = pair<int, int>; using PLI = pair<ll, int>;
const int maxn = 3e5 + 50; const ll inf = 1e18;
struct Edge { int to, id; ll w; };
vector<Edge> adj[maxn]; vector<PII> tadj[maxn]; PII pre[maxn];
ll dis[maxn]; bool vis[maxn]; int n, m, k;
void dijkstra( ) { for( int i = 1; i <= n; ++ i ) { dis[i] = inf, vis[i] = 0; } dis[1] = 0;
priority_queue< PLI, vector<PLI>, greater<PLI> > pq; pq.push({ 0, 1 });
while( !pq.empty( ) ) { auto [d, u] = pq.top( ); pq.pop( );
if( vis[u] ) continue; vis[u] = 1;
for( auto& [v, id, w] : adj[u] ) { if( dis[u] + w < dis[v] ) { dis[v] = dis[u] + w; pre[v] = { u, id }; pq.push({ dis[v], v }); } } } }
void build( ) { for( int i = 2; i <= n; ++ i ) { auto [u, id] = pre[i]; tadj[u].push_back({ i, id }); } }
void bfs( ) { vector<int> ans; queue<int> q; q.push( 1 );
while( !q.empty( ) ) { if( ans.size( ) >= k ) break;
int u = q.front( ); q.pop( );
for( auto& [v, id] : tadj[u] ) { ans.push_back( id ); if( ans.size( ) >= k ) break; q.push( v ); } }
cout << ans.size( ) << '\n'; for( int x : ans ) cout << x << " "; cout << '\n'; }
int main( ) { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m >> k; for( int i = 1; i <= m; ++ i ) { int u, v; ll w; cin >> u >> v >> w; adj[u].push_back({ v, i, w }); adj[v].push_back({ u, i, w }); }
dijkstra( ); build( ); bfs( );
return 0; }
|