Cod sursa(job #1044615)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 30 noiembrie 2013 08:36:39
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<fstream>
#include<vector>
using namespace std;

const int MAXN=50005;
struct edge{int dest,cost;};
vector<edge> adj[MAXN];
ifstream fin("distante.in");
ofstream fout("distante.out");
int t,n,m,s;
int d[MAXN];
bool uz[MAXN];

void solve()
{
	bool flag=true;
	int u,v;
	for (u=1; u<=n && flag; ++u)
	{
		for (vector<edge>::iterator v=adj[u].begin(); v!=adj[u].end(); ++v)
		{
			if (d[u]+v->cost<d[v->dest] || d[v->dest]+v->cost<d[u])
			{
				flag=false;
				break;
			}
			if (d[u]+v->cost==d[v->dest])
				uz[v->dest]=true;
			if (d[v->dest]+v->cost==d[u])
				uz[u]=true;
		}
	}
	for (u=1; u<=n; ++u)
		if (!uz[u])
			flag=false;
	if (flag)
		fout<<"DA\n";
	else
		fout<<"NU\n";
}
void cleanup()
{
	for (int i=1; i<=n; ++i)
	{
		while (!adj[i].empty())
		{
			adj[i].pop_back();
		}
	}
}
int main()
{
	edge aux;
	int a,b,c;
	fin>>t;
	for (int k=1; k<=t; ++k)
	{
		fin>>n>>m>>s;
		for (int i=1; i<=n; ++i)
			fin>>d[i];
		for (int i=1; i<=n; ++i)
		{
			fin>>a>>b>>c;
			aux.dest=b;	aux.cost=c;
			adj[a].push_back(aux);
			aux.dest=a;
			adj[b].push_back(aux);
		}
		solve();
		cleanup();
	}
	fin.close();
	fout.close();
	return 0;
}