Cod sursa(job #762237)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 29 iunie 2012 14:52:23
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<bitset>
#include<queue>
using namespace std;
struct nod {
	int y,cost;
	inline nod (int _y, int _cost) {
		y=_y;
		cost=_cost;
	}
	inline bool operator < (const nod &c) const {
		return cost>c.cost;
	}
};
priority_queue <nod> c;
int l[50001],d[50001],dd[50001];
vector <nod> v[50001];
bitset <50001> p;
inline void dijkstra(int start)
{
	int i,x;
	c.push(nod(start,0));
	while(c.empty()==0) {
		x=c.top().y;
		c.pop();
		if(p[x]==0) {
			p[x]==1;
			for(i=0;i<=l[x];i++) 
				if(d[v[x][i].y]>(d[x]+v[x][i].cost)) {
					d[v[x][i].y]=d[x]+v[x][i].cost;
					c.push(nod(v[x][i].y,d[v[x][i].cost]));
				}
		}
	}
}
int main ()
{
	int n,m,i,t,j,x,y,cost,s;
	ifstream f("distante.in");
	ofstream g("distante.out");
	f>>t;
	for(j=1;j<=t;j++) {
		f>>n>>m>>s;
		for(i=1;i<=n;i++) {
			v[i].clear();
			p[i]=0;
		}
		for(i=1;i<=n;i++)
			f>>dd[i];
		for(i=1;i<=m;i++) {
			f>>x>>y>>cost;
			v[x].push_back(nod(y,cost));
			v[y].push_back(nod(x,cost));
		}
		for(i=1;i<=n;i++) {
			l[i]=v[i].size()-1;
			d[i]=2147000000;
		}
		d[s]=0;
		dijkstra(s);
		s=1;
		for(i=1;i<=n;i++)
			if(dd[i]!=d[i]) {
				s=0;
				break;
			}
		if(s==1)
			g<<"DA";
		else g<<"NU";
		g<<'\n';
	}
	f.close();
	g.close();
	return 0;
}