Cod sursa(job #654270)

Utilizator mika17Mihai Alex Ionescu mika17 Data 29 decembrie 2011 23:29:26
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <climits>
#include <fstream>
#include <vector>
#include <set>
using namespace std;

typedef vector < vector < pair<int,int> > > graph;

int main()
{
	ifstream fin("distante.in",ifstream::in);
	ofstream fout("distante.out",ofstream::out);

	int T;
	fin >> T;
	
	while(T--)
	{
		int V,E,S;

		fin >> V >> E >> S;
		--S;

		graph G(V);

		vector < int > dists (V);

		for(int i=0;i<G.size();++i)
		{
			fin >> dists[i];
		}

		while(E--)
		{
			int src,dest,cap;
			fin >> src >> dest >> cap;
			G[--src].push_back ( make_pair(--dest,cap) );
			G[dest].push_back( make_pair(src,cap) );
		}

		vector < int > cmin(G.size(),INT_MAX);
	
		{
			set < pair <int,int> > Q;

			cmin[S] = 0;
			Q.insert( pair<int,int>(0,S) );

			while(!Q.empty())
			{
				int minNode = Q.begin()->second, minCost = Q.begin()->first;
				Q.erase(Q.begin());
			
				for(vector< pair<int,int> > :: iterator edge = G[minNode].begin(); edge != G[minNode].end(); ++edge)
				{
					if(cmin[edge->first] > minCost + edge->second )
					{
						if( cmin[edge->first] != INT_MAX)
						{
							Q.erase(Q.find( pair<int,int>(cmin[edge->first],edge->first) ) );
						}
						cmin[edge->first] = minCost + edge->second;
						Q.insert ( pair<int,int> ( cmin[edge->first], edge->first ) );
					}
				}
			}

		}

		fout << ( dists == cmin ? "DA" : "NU" ) << '\n' ;
	}

	return 0;
}