Cod sursa(job #2974392)

Utilizator sandry24Grosu Alexandru sandry24 Data 4 februarie 2023 00:06:18
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.16 kb
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pi;
#define pb push_back
#define mp make_pair
#define f first
#define s second

/*typedef struct nod { int nr;  nod *next;  }*lista;
int i,j,n,m,x,y;  lista lda[105];

void add(int x,lista &y) {   lista r=new nod;  r->nr=x;  r->next=y;   y=r; }
int main()
{    cin>>n>>m;
      while(m--)     {    cin>>x>>y;     add(x,lda[y]);  add(y,lda[x]);   }
     cout<<"Listele de adiacenta :\n";
     for(i=1;i<=n;++i)
           {  cout<<i<<": ";
              for(lista p=lda[i];  p;   p=p->next) cout<<p->nr<<' ';
             cout<<'\n';
          }
    return 0;
}*/

struct Node {
    int nr, dist;
    struct Node *next;
};

int n, m, parent[1001], dist[1001];
Node *lda[1001];
Node *r, *p, *v, *mine;

void add_edge(Node *&y, int x, int d){
    r = new Node;
    r->nr = x;
    r->dist = d;
    r->next = y;
    y = r;
}

Node* min_element(Node *h){
    Node *mine = h;
    while(h){
        if(mine->nr > h->nr)
            mine = h;
        h = h->next;
    }
    return mine;
}

void remove_element(Node *h){
    r = p; v = p;
    while(r){
        if(r != h){
            v = r;
            r = r->next;
        } else {
            if(r == p){
                p = r->next;
                delete r;
                v = p;
                r = p;
            } else if(r->next == NULL){
                v->next = NULL;
                delete r;
                r = NULL;
            } else {
                v->next = r->next;
                delete r;
                r = v->next;
            }
        }
    }
}

void Dijkstra(int x){
    dist[x] = 0;
    parent[x] = -1;
    r = new Node; //facem o coada care va tine cont de nodurile procesate si distante
    r->nr = x;
    r->dist = 0;
    r->next = NULL;
    p = r; v = r;
    int cnt = 0;
    while(p != NULL){
        cnt++;
        mine = min_element(p);
        int a = mine->nr;
        remove_element(mine);
        for(Node *h = lda[a]; h != NULL; h = h->next){
            int b = h->nr, d = h->dist;
            if(dist[a] + d < dist[b]){
                dist[b] = dist[a] + d;
                r = new Node;
                r->nr = b;
                r->dist = d;
                r->next = NULL;
                if(v != NULL){
                    v->next = r;
                    v = r;
                } else {
                    v = r;
                    p = r;
                }
                parent[b] = a;
            }
        }
    }
}

void solve(){
    cin >> n >> m;
    for(int i = 0; i < m; i++){
        int a, b, d;
        cin >> a >> b >> d;
        add_edge(lda[a], b, d);
        //add_edge(lda[b], a, d); //daca graful este neorientat
    }  
    for(int i = 0; i <= 1000; i++)
        dist[i] = 1e9;
    Dijkstra(1);
    for(int i = 2; i <= n; i++)
        cout << dist[i] << ' ';
}  
 
int main(){
    //freopen("trie.in", "r", stdin);
    //freopen("trie.out", "w", stdout);
    //ios::sync_with_stdio(0); cin.tie(0);
    int t = 1;
    //cin >> t;
    while(t--){
        solve();
    }
}