Pagini recente » Cod sursa (job #398534) | Cod sursa (job #2393769) | Cod sursa (job #2573947) | Cod sursa (job #183657) | Cod sursa (job #2505780)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <cstdlib>
#include <climits>
#define NMAX 50010
using namespace std;
ifstream fin ("dijkstra.in");
ofstream fout ("dijkstra.out");
struct Adiacenta {
int vec,cost;
};
vector <Adiacenta> edges[NMAX];
queue <int> q;
int fr[NMAX], ap[NMAX], d[NMAX], ok=true;
void citire (int &n, int &m)
{
fin>>n>>m;
int x,y,c;
for(int i=0;i<m;i++)
{
fin>>x>>y>>c;
edges[x].push_back({y,c});
}
}
void set_distances (int n)
{
for (int i=1;i<=n;i++)
d[i]=INT_MAX;
}
void bf (int nod, int n)
{
d[nod]=0;
ap[nod]=1;
fr[nod]++;
q.push(nod);
while (!q.empty())
{
int x=q.front();
q.pop();
ap[x]=0;
for (int i=0;i<edges[x].size();i++)
{
if (d[x]+edges[x][i].cost<d[edges[x][i].vec])
{
d[edges[x][i].vec]=d[x]+edges[x][i].cost;
if (!ap[edges[x][i].vec])
{
q.push(edges[x][i].vec);
ap[edges[x][i].vec]=1;
fr[edges[x][i].vec]++;
if(fr[edges[x][i].vec]>n)
{
ok=false;
fout<<"Ciclu negativ!";
exit(0);
}
}
}
}
}
}
int main()
{
int n,m;
citire(n,m);
set_distances(n);
bf(1,n);
if (ok)
for (int i=2;i<=n;i++)
fout<<d[i]<<" ";
return 0;
}