Cod sursa(job #2964963)

Utilizator SebytomitaTomita Sebastian Sebytomita Data 14 ianuarie 2023 10:47:23
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 5.22 kb
//#include <fstream>
//#include <vector>
//#define NMAX 102
//#define INF 1000000000
//
//using namespace std;
//ifstream cin("dijkstra.in");
//ofstream cout("dijkstra.out");
//
//int n,start;
//struct arc
//{
//    int vf,c;
//}
//;
//vector <arc> G[NMAX];
//int nr[NMAX];
//int lg[NMAX];
//int dmin[NMAX];
//int pre[NMAX];
//bool uz[NMAX];
//
//void citire();
//void dijkstra();
//void afisare();
//
//int main()
//{
//    citire();
//    dijkstra();
//    afisare();
//
//    return 0;
//}
//
//
//void citire()
//{
//    int x,y,c;
//    arc aux;
//    cin>>n>>start;
//    while(cin>>x>>y>>c)
//    {
//        ///adaug pe y in lista de adiacenta a lui x
//        //G[x][lg[x]].vf=y;
//        //G[x][lg[x]].c=c;
//        //lg[x]++;
//        aux.vf=y;
//        aux.c=c;
//        G[x].push_back(aux);
//    }
//}
//void dijkstra()
//{
//    int i,j,minim,vfmin;
//    ///initializare
//    uz[start]=1;
//    for(i=1; i<=n; i++)
//    {
//        pre[i]=start;
//        dmin[i]=INF;
//    }
//    pre[start]=0;
//    dmin[start]=0;
//    for(i=0; i<G[start].size; i++) ///parcurg lista de adiacenta a lui start
//    {
//        dmin[G[start][i].vf]=G[start][i].c;
//    }
//    for(i=0; i<n-1; i++)
//    {
//        ///aflu minimul din dmin pt vf neselectate
//        minim=INF;
//        for(j=1; j<=n; j++)
//        {
//            if(!uz[j] && dmin[j]<minim)
//            {
//                minim=dmin[j];
//                vfmin=j;
//            }
//            if(minim==INF)
//                break;
//            uz[vfmin]=1;
//            ///actualizez eventual dmin pt toate vf neselectate adiacente cu vfmin
//            for(j=0; j<G[vfmin].size; j++)
//            {
//                if(!uz[G[vfmin][j].vf])
//                {
//                    if(dmin[G[vfmin][j].vf]>minim+G[vfmin][j].c)
//                    {
//                        dmin[G[vfmin][j].vf]=minim+G[vfmin][j].c;
//                        pre[G[vfmin][j].vf]=vfmin;
//                        nr[G[vfmin][j].vf]=nr[vfmin];
//                    }
//                    else if(dmin[G[vfmin][j].vf]==minim+G[vfmin][j].c)
//                    {
//                        nr[G[vfmin][j].vf]+=nr[vfmin];
//                    }
//                }
//            }
//        }
//    }
//
//
//}
//void afisare()
//{
//    int i;
//    for(i=1; i<=n; i++)
//    {
//        if(dmin[i]==INF)
//            cout<<-1<<' ';
//        else
//            cout<<dmin[i]<<' ';
//    }
//    cout<<'\n';
//}


//#include <fstream>
//#define NMAX 128
//#define oo 100000000
//using namespace std;
//
//ifstream fin("dijkstra.in");
//ofstream fout("dijkstra.out");
//
//struct arc {int vf, c;};
//
//arc G[NMAX][NMAX];
//int lg[NMAX];
//
//int dmin[NMAX], pre[NMAX];
//bool uz[NMAX];
//
//int n, start;
//
//int main() {
//    fin >> n >> start;
//
//    int x, y, c;
//    while(fin >> x >> y >> c) {
//        G[x][lg[x]].vf = y;
//        G[x][lg[x]].c = c;
//        lg[x] ++;
//    }
//
//    uz[start] = true;
//    for(int i = 1; i <= n; i ++) { pre[i] = start; dmin[i] = oo; }
//
//    pre[start] = 0;
//    dmin[start] = 0;
//
//    for(int i = 0; i < lg[start]; i ++)
//        dmin[G[start][i].vf] = G[start][i].c;
//
//    for(int i = 0; i < n - 1; i ++) {
//        int minim = oo, vfmin;
//        for(int j = 1; j <= n; j ++)
//            if(!uz[j] && dmin[j] < minim) {minim = dmin[j]; vfmin = j;}
//
//        if(minim == oo) break;
//
//        uz[vfmin] = 1;
//        for(int j = 0; j < lg[vfmin]; j ++)
//            if(!uz[G[vfmin][j].vf] && dmin[G[vfmin][j].vf] > minim + G[vfmin][j].c) {
//                dmin[G[vfmin][j].vf] = minim + G[vfmin][j].c;
//                pre[G[vfmin][j].vf] = vfmin;
//            }
//    }
//
//    for(int i = 1; i <= n; i ++)
//        fout << (dmin[i] != oo ? dmin[i] : -1) << ' ';
//
//    return 0;
//}


///priority
#include <bits/stdc++.h>
#include <fstream>
#define cin fin
#define cout fout
#define oo 1<<30
using namespace std;
ifstream cin ("dijkstra.in");
ofstream cout("dijkstra.out");
int n,i,j,k,l,m,a,b,c,cost[50008],incoada[50008];
struct compar
{
    bool operator ()(int a, int b)
    {
        return cost[a]>cost[b];
    }
};
vector <pair<int,int> >G[50008];
priority_queue<int,vector<int>,compar>Q;
void dijkstra(int nod)
{
    for(int i=1;i<=n;i++)
    {
       cost[i]=oo;
    }
    cost[nod]=0;
    Q.push(nod);
    incoada[nod]=1;
    while(!Q.empty())
    {
        k=Q.top();
        Q.pop();
        incoada[k]=0;
        for(auto i:G[k])
        {
            if(cost[i.first]>cost[k]+i.second)
            {
                cost[i.first]=cost[k]+i.second;
                if(incoada[i.first]==0)
                {
                    incoada[i.first]=1;
                    Q.push(i.first);
                }
            }
        }
    }
}
int main()
{
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        cin>>a>>b>>c;
        G[a].push_back({b,c});
    }
    dijkstra(1);
    for(i=2;i<=n;i++)
    {
        if(cost[i]==oo)
            cout<<"0 ";
            else
            cout<<cost[i]<<" ";
    }
    return 0;
}