Pagini recente » Cod sursa (job #846981) | Cod sursa (job #1902988) | Cod sursa (job #2575021) | Cod sursa (job #2304431) | Cod sursa (job #557724)
Cod sursa(job #557724)
#include<fstream>
#include<vector>
#include<queue>
#include<stdio.h>
using namespace std;
#define inf INT_MAX
struct nod{int nr, val;};
vector<nod> v[50002];
queue<int>q;
int N,M,d[30002],X,p[30002],viz[30002],Y;
void citire()
{
nod p;
ifstream in("sate.in");
in>>N>>M>>X>>Y;
for(int i=1;i<=N;i++)
{
p.nr=i;
p.val=0;
v[i].push_back(p);
}
int j,k,x;
while(in>>j>>k>>x)
{
p.nr=k;
p.val=x;
v[j].push_back(p);
p.nr=j;
p.val=x;
v[k].push_back(p);
}
in.close();
}
void af()
{
ofstream out("bellmanford.out");
out<<"Ciclu negativ!\n";
out.close();
exit (0);
}
void bf()
{
int i,y;
for(i=1;i<=N;i++)
if(i==X)
d[i]=0;
else
d[i]=inf;
q.push(X);
p[X]=0;
viz[X]=1;
i=q.front();
while(!q.empty())
{
i=q.front();
q.pop();
for(int j=0;j<(int)v[i].size();j++)
{
y=v[i][j].nr;
if(y>i)
if(d[i]+v[i][j].val<d[y]&&viz[y]==0)
{
d[y]=d[i]+v[i][j].val;
p[y]=i;
viz[y]++;
q.push(v[i][j].nr);
}
if(y<i)
if(d[i]-v[i][j].val<d[y]&&viz[y]==0)
{
d[y]=d[i]-v[i][j].val;
p[y]=i;
viz[y]++;
q.push(y);
}
}
/*if ((int)q.size()>N+3)
af();*/
if (viz[i]>N+1)
af();
}
}
int main()
{
citire();
bf();
ofstream out("sate.out");
//for(int i=0;i<=N;i++)
/// {for(int j=1;j<v[i].size();j++)
// out<<v[i][j].nr<<" "<<v[i][j].val<<" ";
// out<<endl;}
//for(int i=2;i<=N;i++)
out<<d[Y]<<" ";
out<<'\n';
}