#include #include #include #include #include #include using namespace std; typedef pair PII; typedef vector> VII; template void print(vector sez) { for (T x : sez) cout << x << " "; cout << endl; } vector toposort(vector> &sosedi) { int n=sosedi.size(); vector indeg(n); for (int x=0;x q; for (int x=0;x seq; while (!q.empty()) { int x=q.front(); q.pop(); seq.push_back(x); for (int y : sosedi[x]) { indeg[y]--; if (indeg[y]==0) q.push(y); } } return seq; } void Dijsktra(vector> &sosedi, int start, vector &dist, vector &prev) { int n=sosedi.size(); dist=vector(n,-1); prev=vector(n,-1); vector p(n,-1); // -1=neobiskano, -2=koncano p[start] = 0; while (1) { // najmanjsi v okolici int x=-1; for (int i=0;i=0) { if (x==-1 || p[i]=0 && d> &sosedi, int start, vector &dist, vector &prev) { int n=sosedi.size(); dist=vector(n,-1); prev=vector(n,-1); priority_queue, greater> pq; // min heap (dist, x) dist[start]=0; pq.push({0,start}); while (!pq.empty()) { // najmanjsi v okolici auto [d,x]=pq.top(); pq.pop(); if (d!=dist[x]) continue; // ignoriram stare vrednosti // popravim potencialne razdalje for (auto [y,w] : sosedi[x]) { int d=dist[x]+w; if (dist[y]==-1 || d> n >> m; vector> sosedi(n); vector> sosediW(n); for (int i=0;i> a >> b >> c; sosedi[a].push_back(b); sosediW[a].push_back({b,c}); } for (int x=0;x topo = toposort(sosedi); reverse(topo.begin(), topo.end()); vector d(n), nxt(n); for (int x : topo) { for (auto [y,w] : sosediW[x]) { if (w+d[y] > d[x]) { d[x] = w+d[y]; nxt[x] = y; } } } print(d); int start=0; for (int x=0;xd[start]) start=x; } while (d[start]>0) { cout << start << " "; start = nxt[start]; } cout << start << endl; */ ifstream fin("weighted.txt"); int n,m; fin >> n >> m; vector> sosedi(n); for (int i=0;i> a >> b >> c; sosedi[a].push_back({b,c}); sosedi[b].push_back({a,c}); } /* for (int x=0;x dist, prev; Dijsktra(sosedi, 0, dist, prev); print(dist); print(prev); int x=5; while (x!=0) { cout << x << " "; x=prev[x]; } cout << 0 << endl; DijsktraPQ(sosedi, 0, dist, prev); print(dist); print(prev); return 0; }