Pagini recente » Istoria paginii runda/test52718/clasament | Istoria paginii runda/pregatire_lot_juniori_1/clasament | Monitorul de evaluare | Diferente pentru preoni-2007/runda-1/solutii intre reviziile 28 si 29 | Cod sursa (job #2210080)
#include <fstream>
#include <deque>
#include <vector>
#define INF 99999999
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
int N,M;
struct Nod
{
vector <int> Ad;
vector <int> Cost;
};
Nod Graf[50002];
int dist[50002];
int count_q[50002];
bool in_q[50002];
bool ciclu;
void Read()
{
fin>>N>>M;
int a,b,d;
for(int i=1; i<=M; ++i)
{
fin>>a>>b>>d;
Graf[a].Ad.push_back(b);
Graf[a].Cost.push_back(d);
// Graf[b].Ad.push_back(a);
// Graf[b].Cost.push_back(d);
}
fin.close();
}
void Do()
{
for(int i=2; i<=N; ++i)
dist[i]=INF;
deque <int> Q;
int nod_curent;
int w,c;
Q.push_back(1);
while( !Q.empty() && !ciclu )
{
nod_curent=Q.front();
Q.pop_front();
in_q[nod_curent]=0;
for(int i=0; i<Graf[nod_curent].Ad.size(); ++i)
{
w=Graf[nod_curent].Ad[i];
c=Graf[nod_curent].Cost[i];
if(dist[w] > dist[nod_curent] + c)
{
dist[w] = dist[nod_curent] + c;
if( !in_q[w] )
if(count_q[w]>N) { ciclu=1; break; }
else
{
in_q[w]=1;
++count_q[w];
Q.push_back(w);
}
}
}
}
}
void Print()
{
if(ciclu) fout<<"Ciclu negativ!"<<'\n';
else
{ for(int i=2; i<=N; ++i)
fout<<dist[i]<<' ';
fout<<'\n';
}
fout.close();
}
int main()
{
Read();
Do();
Print();
return 0;
}