Cod sursa(job #3325327)

Utilizator CVCiprianConstandache Vlad-Ciprian CVCiprian Data 25 noiembrie 2025 12:32:55
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

const int INFINIT = 1000000000;

int main() {
	int n, s;
	if (!(cin >> n >> s)) return 0;

	vector<vector<int>> a(n + 1, vector<int>(n + 1));
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= n; ++j)
			cin >> a[i][j];

	vector<int> d(n + 1, INFINIT), f(n + 1, 0);

	// nodul sursa este s
	for (int i = 1; i <= n; ++i) {
		f[i] = 0;
		d[i] = a[s][i];
	}

	f[s] = 1;
	d[s] = 0;
    for (int i = 1; i <= n; ++i) { d[i] = INFINIT; f[i] = 0; }
    d[s] = 0;

    priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
    pq.emplace(0, s);

    while (!pq.empty()) {
        auto [dist, u] = pq.top(); pq.pop();
        if (dist != d[u]) continue; 
        if (f[u]) continue;
        f[u] = 1;

        for (int v = 1; v <= n; ++v) {
            if (f[v] == 0 && d[v] > d[u] + a[u][v]) {
                d[v] = d[u] + a[u][v];
                pq.emplace(d[v], v);
            }
        }
    }

    for (int i = 1; i <= n; ++i)
        f[i] = 1;
        
	for (int k = 1; k < n; ++k) {
		int pmax = 0;
		for (int i = 1; i <= n; ++i)
			if (f[i] == 0 && d[i] < d[pmax])
				pmax = i;

		if (pmax != 0 && d[pmax] < INFINIT) {
			f[pmax] = 1;
			for (int i = 1; i <= n; ++i)
				if (f[i] == 0 && d[i] > d[pmax] + a[pmax][i])
					d[i] = d[pmax] + a[pmax][i];
		} else {
			break;
		}
	}

	// afisare 
	for (int i = 1; i <= n; ++i) {
		if (d[i] >= INFINIT) cout << "INF";
		else cout << d[i];
		if (i < n) cout << ' ';
	}
	cout << '\n';

	return 0;
}