Pagini recente » Cod sursa (job #1860159) | Cod sursa (job #281255) | Cod sursa (job #2628158) | Cod sursa (job #1680080) | Cod sursa (job #4209)
Cod sursa(job #4209)
#include <stdio.h>
#include <string>
#include <stdlib.h>
#define nil -1
#define oo 0x3f3f3f3f
#define maxn 50005
#include <deque>
#include <set>
#include <multiset.h>
#include <algorithm>
#define MAX_SIZE (10*(19+50000*10+1700019))
using namespace std;
struct nod { int x,w;};
struct dijkstra{ deque<nod>a;};
struct avl{ int d, v;};
bool operator < (const avl &a, const avl &b)
{
if(a.d<b.d) return true;
if(a.d==b.d) if(a.v<b.v) return true;
return false;
}
multiset<avl> Q;
int d[maxn], pi[maxn];
int T;
dijkstra mat[maxn];
int n, m, i, j;
int v[maxn];
int sum, nr;
deque<nod>::iterator it;
int sol[maxn], p, qq;
int comp[maxn];
char cit[MAX_SIZE];
void initializeaza_sursa_unica(int s);
void relaxeaza(int u, int v, int w);
int extrage_min();
void dijkstra(int s);
void citire()
{
int p, q, w;
FILE*f=fopen("distante.in", "r");
fread(cit, sizeof(char),MAX_SIZE , f);
nod aux;
char *o;
o=strtok(cit, " \n");
T=atoi(o);
//printf("%d\n", T);
int k;
n=maxn-1;
for(k=1;k<=T;k++)
{
for(i=1;i<=n;i++) mat[i].a.clear();
o=strtok(NULL, " ");
n=atoi(o);
o=strtok(NULL, " ");
m=atoi(o);
o=strtok(NULL, " \n");
qq=atoi(o);
for(i=1;i<=n;i++)
{
o=strtok(NULL, " \n");
comp[i]=atoi(o);
}
o=strtok(NULL, " ");
p=atoi(o);
o=strtok(NULL, " ");
q=atoi(o);
o=strtok(NULL, " \n");
w=atoi(o);
aux.x=q;
aux.w=w;
mat[p].a.push_back(aux);
aux.x=p;
aux.w=w;
mat[q].a.push_back(aux);
for(i=2;i<=m;i++)
{
o=strtok(NULL, " ");
p=atoi(o);
o=strtok(NULL, " ");
q=atoi(o);
o=strtok(NULL, " \n");
w=atoi(o);
aux.x=q;
aux.w=w;
mat[p].a.push_back(aux);
aux.x=p;
aux.w=w;
mat[q].a.push_back(aux);
}
dijkstra(qq);
int ok=1, i;
for(i=1;i<=n && ok;i++) if(comp[i]!=d[i]) ok=0;
if(ok) printf("DA\n");
else printf("NU\n");
}
fclose(f);
}
void initializeaza_sursa_unica(int s)
{
avl aux;
for(int i=1;i<=n;i++)
if(i!=s)
{
aux.v=i;
aux.d=oo;
Q.insert(aux);
}
memset(d, oo, sizeof(d));
memset(pi, nil, sizeof(pi));
d[s]=0;
aux.d=0;
aux.v=s;
Q.insert(aux);
}
inline void relaxeaza(int u, int v, int w)
{
if(d[v]>d[u]+w)
{ avl aux;
aux.d=d[v];
aux.v=v;
Q.erase(aux);
aux.d=d[u]+w;
Q.insert(aux);
d[v]=d[u]+w;
pi[v]=u;
}
}
inline int extrage_min()
{
int x=Q.begin()->v;
Q.erase(Q.begin());
return x;
}
void dijkstra(int s)
{
initializeaza_sursa_unica(s);
int u;
while(Q.size())
{
u=extrage_min();
for(it=mat[u].a.begin();it!=mat[u].a.end();++it)
relaxeaza(u, it->x, it->w);
}
}
int main()
{
freopen("distante.out", "w", stdout);
citire();
return 0;
}