Cod sursa(job #898186)

Utilizator wink.itsgoneDragusanu Ana wink.itsgone Data 28 februarie 2013 08:40:29
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<cstdio>
#include<vector>
#include<queue>
#define DIM 32768
#define NMAX 50005
#define inf 0x3fffff
using namespace std;
char ax[DIM];
int pz,n,m,x,y,z,aux,T,s,ok,bronzarel[NMAX];
struct graf{int nod,cost;} e;
vector<graf> a[NMAX];
vector<int> d(NMAX,inf);
queue<int> Q;
inline void cit(int &x)
{x=0;
 while(ax[pz]<'0'||ax[pz]>'9')
	if(++pz==DIM)fread(ax,1,DIM,stdin),pz=0;
 while(ax[pz]>='0'&&ax[pz]<='9')
	{x=x*10+ax[pz]-'0';
	 if(++pz==DIM)fread(ax,1,DIM,stdin),pz=0;
	}
}
void dijkstra()
{Q.push(s); d[s]=0;
 while(!Q.empty())
	{aux=Q.front();Q.pop();
	 for(unsigned int i=0;i<a[aux].size();++i)
		{int wnod=a[aux][i].nod,wcost=a[aux][i].cost;
		 if(d[wnod]>d[aux]+wcost) 
			{
			 d[wnod]=d[aux]+wcost;
			 Q.push(wnod);
			}
		}
	}
}
void scrie()
{ok=1;
 for(register int i=1;i<=n;++i)
	if(d[i]!=bronzarel[i]) {ok=0;break;}
 if(ok==1) printf("DA\n");
	else printf("NU\n");
}
int main()
{freopen("distante.in","rt",stdin); freopen("distante.out","wt",stdout);
 cit(T);
 for(register int i=1;i<=T;++i)
	{cit(n);cit(m);cit(s);
	 for(register int j=1;j<=n;++j) cit(bronzarel[j]);
	 for(register int j=1;j<=m;++j) cit(x),cit(y),cit(z),e.nod=y,e.cost=z,a[x].push_back(e),e.nod=x,a[y].push_back(e);
	 dijkstra();
	 scrie();
	}
 return 0;
}