Pagini recente » Cod sursa (job #2555442) | Cod sursa (job #330772) | Cod sursa (job #466434) | Cod sursa (job #2954708) | Cod sursa (job #2666120)
#include<bits/stdc++.h>
///Problema Distante de pe Infoarena
using namespace std;
///Algoritmul Dijkstra-gasirea drumului minim
// Mod de rezolvare: Avem vectorul D[] unde D[i] reprezinta distanta minima
//dintre varful de start si i. Initializam toate distantele cu oo=(1<<30) adica 2^30.
// Parcurgem folosind un fel de bfs mai special-adica folosind:Coada de prioritate
int D[50001];
int D2[5001];
int oo=(1<<30);
ifstream in("distante.in");
ofstream out("distante.out");
struct compara
{ bool operator()(int x,int y)
{
return D[x]>D[y];
}
};
///Avem conditia: Au prioritate elementele cu distanta cea mai mica,
/// adica cele cu D[i] mai mic vor iesi inainte decat cele cu D[i] mai mare
priority_queue< int, vector<int>, compara>Coada;
///Priority queue
///Primul parametru reprezinta tipul elementelor puse in coada
///Al doilea parametru este structura in care adunam toate obiectele din coada,
///in cazul nostru: un vector de int-uri
///Ultimul parametru (care este optional) este o functie ce returneaza TRUE sau FALSE
///in functie de interogarile noastre
vector < pair<int,int> >Muchii[50001];
int nr_grafuri,N,M,S;
bool Incoada[50001];//Ca sa nu le punem de mai multe ori verificam daca se afla in coada
bool verificare()
{ for(int i=1;i<=N;i++)
if(D[i]!=D2[i])
return 0;
return 1;
}
void Dijkstra(int Nodstart)
{ for(int i=1;i<=N;i++)
{D[i]=oo;
Incoada[i]=false;//=0
}
Coada.push(Nodstart);
D[Nodstart]=0;
Incoada[Nodstart]=true;
while(!Coada.empty())
{ int Nodcurent=Coada.top();
Coada.pop();
Incoada[Nodcurent]=false;
for(size_t i=0;i<Muchii[Nodcurent].size();i++)
{ int Vecin=Muchii[Nodcurent][i].first;
int Cost=Muchii[Nodcurent][i].second;
if(D[Vecin]>D[Nodcurent]+Cost)
{ D[Vecin]=D[Nodcurent]+Cost;
if(Incoada[Vecin]==false)
{ Coada.push(Vecin);
Incoada[Vecin]=true;
}
}
}
}
for(int i=1;i<=N;i++)
if(D[i]==oo)
D[i]=0;
}
int main()
{ in>>nr_grafuri;
for(int i=1;i<=nr_grafuri;i++)
{
in>>N>>M>>S;//nodul de start
for(int j=1;j<=N;j++)
in>>D2[j];
for(int j=1;j<=M;j++)
{ int x,y,c;//c-este costul
in>>x>>y>>c;
Muchii[x].push_back(make_pair(y,c));
}
Dijkstra(S);
if(verificare())
out<<"DA"<<'\n';
else
out<<"NU"<<'\n';
for(int j=1;j<=N;j++)
Muchii[j].clear();
}
return 0;
}