Untitled
user_5668965
c_cpp
a year ago
1.9 kB
16
Indexable
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
#define pb push_back
#define ff first
#define ss second
const int N=3e5+7;
const int mod=1e9+7;
const double eps=1e-6;
const double pi= 3.14159265358979323846;
using namespace std;
using namespace __gnu_pbds;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag,
tree_order_statistics_node_update>
op_set;
int32_t main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin >> n >> m;
vector<vector< array<long long,3> >> g(n);
vector<long long> wts(m);
for(int i=0;i<m;i++)
{
int u,v,wt;
cin >> u >> v >> wt;
u--;
v--;
g[u].pb( {v,wt,i} );
g[v].pb( {u,wt,i} );
wts[ i ]=wt;
}
int sr;
cin >> sr;
sr--;
vector<long long> dist(n,1e18);
vector<int> useful(n,-1);
set< pair<long long,int> > dij;
dist[sr]=0;
dij.insert( {0,sr} );
while(dij.size()!=0)
{
auto val=*dij.begin();
dij.erase(val);
int node=val.second;
for(auto &info : g[node] )
{
int child=info[0];
long long wt=info[1];
long long edno=info[2];
if(dist[child]>=dist[node]+wt)
{
dij.erase( {dist[child],child} );
dist[child]=dist[node]+wt;
dij.insert( {dist[child],child} );
useful[child]=edno;
}
}
}
long long ans=0;
for(auto ele : useful)
{
if(ele!=-1)
ans=ans+wts[ele];
}
cout << ans << "\n";
for(auto ele : useful)
{
if(ele!=-1)
cout << ele+1 << " ";
}
}
/*
I have a hopeless crush on someone who I don't even have a chance on
*/Editor is loading...
Leave a Comment