Pagini recente » album2 | infoarena - comunitate informatica, concursuri de programare | album2 | Cod sursa (job #666985) | Cod sursa (job #2201064)
#include <bits/stdc++.h>
#define INF 1e9
using namespace std;
struct muchie
{
int first,second,lenght;
};
vector<muchie>muc;
vector<int>inc[50005];
deque<int>verify;
int last[50005];
int mn[50005];
int n,m,pos1,pos2,l;
int main()
{
freopen("bellmanford.in","r",stdin);
freopen("bellmanford.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&pos1,&pos2,&l);
muc.push_back({pos1,pos2,l});
inc[pos1].push_back(i-1);
}
verify.push_back(1);
for(int i=2;i<=n;i++)
{
mn[i]=INF;
}
mn[1]=0;
int i;
for(i=1;i<=n-1;i++)
{
int howfar=verify.size();
if(howfar==0)
break;
for(int j=0;j<howfar;j++)
{
int pas=verify.front();
verify.pop_front();
for(int par=0;par<inc[pas].size();par++)
{
int pos=inc[pas][par];
if(mn[muc[pos].second]<=mn[muc[pos].first]+muc[pos].lenght)
continue;
mn[muc[pos].second]=mn[muc[pos].first]+muc[pos].lenght;
if(last[muc[pos].second]==i)
continue;
last[muc[pos].second]=i;
verify.push_back(muc[pos].second);
}
}
}
bool k=0;
if(i==n)
{
for(int j=0;j<m;j++)
{
if(mn[muc[j].second]<=mn[muc[j].first]+muc[j].lenght)
continue;
k=1;
mn[muc[j].second]=mn[muc[j].first]+muc[j].lenght;
}
if(k==1)
{
printf("Ciclu negativ!");
return 0;
}
}
for(int i=2;i<=n;i++)
printf("%d ",mn[i]);
return 0;
}