Cod sursa(job #2174286)

Utilizator serban24Popovici Serban-Florin serban24 Data 16 martie 2018 11:29:00
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>
#define INF 1000000
#define NMAX 50005
#define cst first
#define nod second

using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

vector < pair<int,int> > mv[NMAX];
priority_queue < pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > q;
int viz[NMAX];
int cost[NMAX];
int rezultate[NMAX];

int dijkstra(int x, int nn){
	int i;

	cost[x]=0;
	q.push(make_pair(0,x));

	while(!q.empty()){
        x=q.top().nod;
        q.pop();

		if(viz[x])
			continue;

		viz[x]=1;

		for(i=0;i<mv[x].size();i++)
			if(cost[mv[x][i].nod]>cost[x]+mv[x][i].cst){
				cost[mv[x][i].nod]=cost[x]+mv[x][i].cst;
				q.push(make_pair(cost[mv[x][i].nod],mv[x][i].nod));
			}
	}

	for(i=1;i<=nn;i++)
		if(cost[i]!=rezultate[i])
			return 0;

	return 1;
}

int main(){
	int t,n,m,s,x,y,c,i;

	fin>>t;

	for(int j=1;j<=t;j++){
		fin>>n>>m>>s;

		memset(cost,INF,sizeof(cost));
		memset(viz,0,sizeof(viz));

		for(i=1;i<=n;i++)
			fin>>rezultate[i];

		for(i=1;i<=m;i++){
			fin>>x>>y>>c;
			mv[x].push_back(make_pair(c,y));
			mv[y].push_back(make_pair(c,x));
		}

		if(dijkstra(s,n))
			fout<<"DA\n";
		else
			fout<<"NU\n";
	}

    return 0;
}