Cod sursa(job #3336736)

Utilizator edimogaMoga Edi edimoga Data 25 ianuarie 2026 16:25:53
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 11.15 kb
#include  <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <bitset>

using namespace std;
const int NMAX = 1e5;




ifstream in ("dijkstra.in");
ofstream out ("dijkstra.out");

int main () {

    // HAVEL HAKIMI -
    //
    //global
    //
    //// bool havelHakimi(int deg[NMAX+1], int m) {
    //
    //     int sum=0;
    //     for (int i=0; i<m; i++) {
    //         sum+=deg[i];
    //         if (deg[i]>=m) return false;
    //         if (deg[i]<0) return false;
    //     }
    //     if ( sum%2 ==1 ) return false;
    //     sort(deg, deg+m, greater<int>());
    //     for (int i=0; i<m; i++) {
    //         int t=deg[i];
    //         if (t > m-i-1) return false;
    //         for (int j=i+1; j<i+t+1; j++) {
    //             deg[j]--;
    //             if (deg[j]<0) return false;
    //         }
    //         deg[i]=0;
    //         if (deg[i]>0 ) return false;
    //         sort(deg, deg+m, greater<int>());
    //     }
    //     return true;
    // }
    //
    //main
    //
    // int n, m;
    // in>>n;
    // for (int i=0; i<n; i++) {
    //     in>>m;
    //     int deg[100001];
    //     for (int j=0; j<m; j++) {
    //         in>>deg[j];
    //     }
    //     int ok=havelHakimi(deg, m);
    //
    //     if (ok==1) out<<"POSSIBLE"<<endl;
    //     else out<<"IMPOSSIBLE"<<endl;
    // }


    //BFS - distanta de la un nod S la restul nodurilor
    // int n,m,a,b,s;
    // in>>n>>m>>s;
    // vector<vector<int> > adj(n+1);
    //
    // for (int i=0; i<m; i++) {
    //     in>>a>>b;
    //     adj[a].push_back(b);
    // }
    // vector<int> dist(n+1, -1);
    // queue<int> q;
    // dist[s]=0;
    // q.push(s);
    //
    // while(!q.empty()) {
    //     int u=q.front();
    //     q.pop();
    //     for ( auto i : adj[u]) {
    //         if (dist[i]==-1) {
    //             dist[i]=dist[u]+1;
    //             q.push(i);
    //         }
    //     }
    // }
    //
    // for ( int i=1; i<=n; i++ ) {
    //     out<<dist[i]<<" ";
    // }

    //DFS - cate componente conexe are un graf
    // int n,m;
    // in>>n>>m;
    // vector<vector<int>> lista(1000000);
    // for ( int i=1;i<=m;i++) {
    //     int x,y;
    //     in>>x>>y;
    //     lista[x].push_back(y);
    //     lista[y].push_back(x);
    // }
    //
    // vector< int> vis(n+1, 0);
    // vector<int> stack;
    // int comp=0;
    //
    // for (int i=1;i<=n;i++) {
    //     if (!vis[i]) {
    //         comp++;
    //         stack.clear();
    //         stack.push_back(i);
    //         vis[i]=1;
    //     }
    //     else continue;
    //     while (!stack.empty()) {
    //         int u=stack.back();
    //         stack.pop_back();
    //         for ( auto v : lista[u]) {
    //             if ( !vis[v] ) {
    //                 vis[v]=1;
    //                 stack.push_back(v);
    //             }
    //         }
    //     }
    // }
    //
    // out << comp << endl;

    //BFS - berarie2 muchii inversate
    // int n,m,p;
    // in>>n>>m>>p;
    // vector<vector<int> > adj (n+1);
    // for ( int i = 1; i <= m; i++ ) {
    //     int x,y;
    //     in>>x>>y;
    //     adj[y].push_back(x);
    // }
    // queue<int> q;
    // vector<int> vis (n+1,0);
    //
    // for (int i = 1; i <= p; i++ ) {
    //     int z;
    //     in>>z;
    //     if (!vis[z]) {
    //         vis[z] = 1;
    //         q.push(z);
    //     }
    // }
    //
    // while ( !q.empty() ) {
    //     int x = q.front();
    //     q.pop();
    //     for ( auto v: adj[x] ) {
    //         if ( !vis[v] ) {
    //             vis[v] = 1;
    //             q.push(v);
    //         }
    //     }
    // }
    // vector<int> ans;
    // for ( int i = 1; i <= n; i++ ) {
    //     if ( !vis[i] ) {
    //         ans.push_back(i);
    //     }
    // }
    // out<<ans.size()<<endl;
    // for ( int i = 0; i < ans.size(); i++ ) {
    //     out<<ans[i]<<"\n";
    // }


    // KOSARAJU - determina ctc dintr-un graf
    //
    // asta e in global
    //
    // vector<vector<int>> g;
    // vector<vector<int>> gT;
    // vector<int> viz;
    // stack<int> st;
    //
    // void dfs(int vf){
    //     viz[vf]=1;
    //     for (int x: g[vf]) {
    //         if (!viz[x])
    //             dfs(x);
    //
    //     }
    //     st.push(vf);
    // }
    //
    // void dfsT(int vf, vector<int> &v) {
    //     viz[vf]=1;
    //     v.push_back(vf);
    //     for ( int x : gT[vf]) {
    //         if (!viz[x])
    //             dfsT(x,v);
    //     }
    // }
    //
    // asta e in main
    //
    // int n,m;
    // in>>n>>m;
    // g.resize(n+1);
    // gT.resize(n+1);
    // viz.assign(n+1, 0);
    // for( int i=1;i<=m;i++) {
    //     int x,y;
    //     in>>x>>y;
    //     g[x].push_back(y);
    //     gT[y].push_back(x);
    // }
    //
    // for ( int i=1;i<=n;i++) {
    //     if (!viz[i])
    //         dfs(i);
    // }
    // viz.assign(n+1,0);
    // vector<vector<int>> comp;
    //
    // while (!st.empty()) {
    //     int vf = st.top();
    //     st.pop();
    //     if ( !viz[vf]) {
    //         vector<int> vv;
    //         dfsT(vf,vv);
    //         comp.push_back(vv);
    //     }
    // }
    //
    // out<<comp.size()<<endl;
    // for (vector<int> v : comp) {
    //     for (int x: v) {
    //         out<< x<< " ";
    //     }
    //     out<< endl;
    // }


    //SORTARE TOPOLOGICA

    // global
    // vector<vector<int>> adj;
    // vector<int> viz, ord;
    //
    // void dfs(int vf) {
    //     viz[vf]=1;
    //     for ( auto x : adj[vf]) {
    //         if (!viz[x])
    //             dfs(x);
    //     }
    //     ord.push_back(vf);
    // }
    //
    // main
    // int n,m;
    // in>>n>>m;
    // viz.resize(n+1);
    // adj.resize(n+1);
    // ord.clear();
    // for (int i=1;i<=m;i++) {
    //     int x,y;
    //     in>>x>>y;
    //     adj[x].push_back(y);
    // }
    //  for ( int i =1; i<=n; i++) {
    //      if (!viz[i])
    //          dfs(i);
    //  }
    //
    // reverse(ord.begin(), ord.end());
    //
    // for ( int i : ord) out<< i<< " ";


    //bipartit -colorare bfs mod
    // int n,m;
    // in>>n>>m;
    // vector<vector<int> > adj(n+1);
    // vector<int> color( n+1, 0);
    // queue<int> q;
    //
    // for ( int i=1;i<=m;i++) {
    //     int x,y;
    //     in>>x>>y;
    //     adj[x].push_back(y);
    //     adj[y].push_back(x);
    // }
    //
    // for (int i=1;i<=n;i++) {
    //     if (color[i]==0 ) {
    //         color[i]=1;
    //         q.push(i);
    //
    //         while (!q.empty()) {
    //             int u=q.front();
    //             q.pop();
    //             for ( int x : adj[u]) {
    //                 if ( color[x] == 0) {
    //                     color[x]=3-color[u];
    //                     q.push(x);
    //                 }
    //                 else if (color[x]==color[u]) {
    //                     out<<"IMPOSSIBLE\n";
    //                     return 0;
    //                 }
    //             }
    //         }
    //     }
    // }
    // for ( int i =1; i<=n;i++)
    //     out<< color[i]<< " ";

    // Tarjan - puncte de articulatie problema Vice City
    //
    //global
    //
    // vector<int> lista[NMAX+1];
    // vector<bool> rez;
    // int tin[NMAX+1], low[NMAX+1], timer;
    //
    // void dfs(int u, int parent) {
    //     int children=0;
    //     tin[u]= low[u]= ++timer;
    //     for ( int v: lista[u]) {
    //         if (v ==parent) continue;
    //         if (tin[v]== 0) {
    //             children++;
    //             dfs(v, u);
    //             low[u]=min(low[u],low[v]);
    //             if ( parent != -1  && low[v]>=tin[u])
    //                 rez[u]= true;;
    //         }
    //         else{
    //             low[u]=min(low[u],tin[v]);
    //         }
    //     }
    //     if ( parent == -1 && children >=2 )
    //         rez[u]=true;
    // }
    //
    //main
    // int n,m;
    // cin>>n>>m;
    // while ( n!=0 && m!=0 ) {
    //
    //     for( int i =0 ; i<= n; i++)  lista[i].clear();
    //     timer=0;
    //     for( int i =0 ; i<= n; i++)  tin[i]=low[i]=0;
    //     rez.assign(n+1, false);
    //
    //     for ( int i=1;i<=m;i++) {
    //         int a,b;
    //         cin>>a>>b;
    //         lista[a].push_back(b);
    //         lista[b].push_back(a);
    //     }
    //
    //     for ( int i =1; i<=n;i++) {
    //         if ( tin[i]==0)
    //             dfs(i,-1);
    //     }
    //     int ans=0;
    //     for (int i=1;i<=n;i++) {
    //         if (rez[i]) ans++;
    //     }
    //     cout<< ans<< '\n';
    //     cin>>n>>m;
    // }
    //


    //KRUSKAL
    //
    //global
    // struct Edge {
    //     int u,v,w;
    //     bool operator<( const Edge &m) const{
    //         return w<m.w;
    //     }
    // };
    //
    // vector<Edge> apm,edg;
    //
    // int find(int x, vector<int> &v) {
    //     if (v[x]==0)
    //         return x;
    //     return find( v[x], v) ;
    // }
    //
    // void unire ( int x, int y, vector< int> &tata , vector<int> &rang) {
    //     int rx= find( x, tata);
    //     int ry= find(y,tata);
    //
    //     if ( rang[rx] < rang [ry]) swap (rx, ry);
    //     tata[ry]=rx;
    //     if ( rang[rx] == rang[ry]) rang[rx]++ ;
    // }
    //
    //main
    // int n,m,cost=0;
    // in>>n>>m;
    // for ( int i=1; i<=m;i++) {
    //     Edge e;
    //     in>>e.u>>e.v>> e.w;
    //     edg.push_back(e);
    // }
    //
    // sort(edg.begin(), edg.end());
    //
    // vector<int> tata(n+1,0), rang(n+1,0);
    // for ( auto &e: edg) {
    //     if ( apm.size() == n-1 )
    //         break;
    //     if ( find(e.u, tata)!= find( e.v,tata)) {
    //         cost+=e.w;
    //         apm.push_back(e);
    //         unire(e.u,e.v,tata, rang);
    //     }
    // }
    //
    // out<< cost<< '\n';
    // out<<apm.size()<<'\n';
    //
    // for ( auto &e: apm) {
    //     out<<e.u<<" "<<e.v<<'\n';
    // }


    //DIJKSTRA
    int n,m;
    in>>n>>m;
    vector<vector< pair<int,int> >> adj(n+1);
    for ( int i =1;i<=m;i++) {
        int a,b,c;
        in>>a>>b>>c;
        adj[a].push_back({b,c});
    }

    const long long INF =1e18;

    vector<long long> dist(n+1, INF);
    dist[1]=0;

    priority_queue< pair< long long, int>, vector<pair<long long,int>>, greater< pair< long long , int>>> pq;
    pq.push({0,1});

    while (!pq.empty()) {
        auto [d,u] = pq.top();
        pq.pop();

        if (d != dist[u]) continue;

        for ( auto [v,w] : adj[u]) {
            if (dist[v] > dist[u] +w) {
                dist[v]= dist[u]+w;
                pq.push({ dist[v], v});
            }
        }
    }
    for (int i=2;i<=n;i++) {
        if ( dist[i] == INF ) out<< 0<<" ";
        else out<<dist[i]<< " ";
    }
    return 0;
}