Cod sursa(job #1915272)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 8 martie 2017 20:26:05
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(0);
#define tie cin.tie(0);
#define mp make_pair
#define pb push_back
#define ll long long
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define zeros(x) ( (x ^ (x - 1)) & x )
#define INF 0x3f3f3f3f
    
using namespace std;

int n, m, k, x, y, z, t;
vector < PII > V[50100];
int dist[50100], check[50100];

void dijkstra(int x)
{
	multiset < PII > S;
    S.insert({0, x});
    for (int i = 1; i <= n; i++) dist[i] = INF; 
    dist[x] = 0;
    while (!S.empty())
    {
        int curr = S.begin()->second;
        S.erase(S.begin());
        for (auto it : V[curr])
        {
            int next = it.first;
            int w = it.second;
            if (dist[next] > dist[curr] + w)
            {
                if (dist[next] != INF)
                    S.erase(S.find({dist[next], next}));
                dist[next] = dist[curr] + w;
                S.insert({dist[next], next});
            }
        }
    }
}

int main(){
	IOS tie
	ifstream cin("distante.in");
	ofstream cout("distante.out");
	cin >> t;
	int l = t;
	while (t--)
	{
	    int fl = 1;
        cin >> n >> m >> k;
        if (t < l)
			for (int i = 1; i <= n; i++)
				V[i].clear();
        for (int i = 1; i <= n; i++) 
			cin >> check[i];
        while (m--)
        {
            cin >> x >> y >> z;
            V[x].push_back({y, z});
            V[y].push_back({x, z});
        }
        dijkstra(k);
        for (int i = 1; i <= n; i++)
        {
            dist[i] = (dist[i] == INF ? 0 : dist[i]);
            if (dist[i] != check[i]){fl = 0; break;}
        }
	    cout << (fl ? "DA" : "NU") << "\n";
	}
    cerr << "Fucking time elapsed: " << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" << '\n';
    return 0;
}