-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathdijkestra.cpp
68 lines (66 loc) · 1.26 KB
/
dijkestra.cpp
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
#include<bits/stdc++.h>
using namespace std;
vector<pair<long long,long> > adjmat[300007];
long wt[300007],u,par[300007];
bool vis[300007];
long long dist[3000007],inf=1000000000000000000;
priority_queue< pair<long long,long>,vector< pair<long long,long> >,greater< pair<long long,long> > >pq;
int main()
{
long i,j,k,l,m,n;
scanf("%ld%ld",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%ld%ld%ld",&j,&k,&wt[i]);
adjmat[j].push_back(pair<long long,int>(k,i));
adjmat[k].push_back(pair<long long ,int>(j,i));
}
scanf("%ld",&u);
for(i=1;i<=n;i++)
{
vis[i]=false;
dist[i]=inf;
}
pq.push(make_pair(0,u));
dist[u]=0;
while(!pq.empty())
{
long g,a,b;
g = pq.top().second;
pq.pop();
if(vis[g]==true)
{
continue;
}
vis[g]=true;
for(i=0;i<adjmat[g].size();i++)
{
a=adjmat[g][i].first;b=adjmat[g][i].second;
if(dist[a]>dist[g]+wt[b])
{
dist[a]=dist[g]+wt[b];
pq.push(make_pair(dist[a],a));
par[a]=b;//edge no b is included
}
else if(dist[a]==dist[g]+wt[b]&&wt[par[a]]>wt[b])
{//new egde has even lesser wt so , reject older one n add new edge no.
par[a]=b;
}
}
}
//printf("%ld\n",par[u]);
par[u]=0;
long long sum= 0;
for(i=1;i<=n;i++)
sum+=wt[par[i]];
cout<<sum<<endl;
//printf("%lld\n",sum);
//included edges are
for(i=1;i<=n;i++)
{
if(i!=u)
printf("%ld ",par[i]);
}
printf("\n");
return 0;
}