Cod sursa(job #762239)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 29 iunie 2012 14:57:00
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 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 d[50001],dd[50001];
vector <nod> v[50001];
bitset <50001> p;
inline void dijkstra(int start)
{
	int x,y,cost;
	c.push(nod(start,0));
	while(c.empty()==0) {
		x=c.top().y;
		c.pop();
		if(p[x]==0) {
			p[x]==1;
			for(vector <nod>::iterator it=v[x].begin();it!=v[x].end();it++) {
				y=it->y;
				cost=it->cost+d[x];
				if(d[y]>cost) {
					d[y]=cost;
					c.push(nod(y,d[y]));
				}
			}
		}
	}
}
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++) 
			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;
}