Pagini recente » Cod sursa (job #2379280) | Cod sursa (job #1875133) | Cod sursa (job #1178630) | Cod sursa (job #2655315) | Cod sursa (job #492276)
Cod sursa(job #492276)
#include<fstream>
#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
#include<queue>
#include<cstring>
#define MAXN 50001
#define INF 0x17D7841
using namespace std;
typedef unsigned short uint16;
typedef pair<pair<uint16,uint16>,short> Edge;
struct Compare
{
const bool operator() (const Edge& a, const Edge& b) const
{
return a.second<b.second;
}
};
void BellmanFord(const vector<vector<Edge> >& edges,
const int n,
const int m,
const uint16 s,
int *dist)
{
queue<uint16> Q[2];
int which=0;
//bool passed[MAXN]={false};
memset(dist,0x3f,n*sizeof(int));
dist[s]=0;
//for(int i=0; i<(int)edges[s].size(); ++i)
// Q[0].push(edges[s][i].first.first);
Q[0].push(s);
for(int i=0; i<n-1; ++i)
{
while(!Q[which].empty())
{
const int node=Q[which].front();
Q[which].pop();
for(int j=0; j<(int)edges[node].size(); ++j)
if(dist[edges[node][j].first.first] + edges[node][j].second < dist[edges[node][j].first.second])
{
dist[edges[node][j].first.second]=dist[edges[node][j].first.first] + edges[node][j].second;
Q[!which].push(edges[node][j].first.second);
}
}
which=!which;
}
}
bool CheckForCycle(vector<vector<Edge> >& edges,
const int *dist)
{
for(vector<vector<Edge> >::iterator it=edges.begin(); it!=edges.end(); it++)
{
for(int i=0; i<(int)it->size(); ++i)
if(dist[(*it)[i].first.first] + (*it)[i].second < dist[(*it)[i].first.second])
return true;
}
return false;
}
int main()
{
uint16 a,b;
short c;
int n,m,dist[MAXN];
fstream fin("bellmanford.in", fstream::in);
fstream fout("bellmanford.out", fstream::out);
vector<vector<Edge> > edges;
fin>>n>>m;
//cout<<n<<" "<<m<<endl;
edges.resize(n);
for(int i=0; i<m; ++i)
{
fin>>a>>b>>c;
//cout<<a-1<<" "<<b-1<<" "<<c<<endl;
edges[a-1].push_back(make_pair(make_pair(a-1,b-1),c));
}
BellmanFord(edges,n,m,0,dist);
if(CheckForCycle(edges,dist))
{
fout<<"Ciclu negativ!\n";
}
else
{
for(int i=1; i<n; ++i)
{
fout<<dist[i]<<" ";
}
}
cout<<endl;
fin.close();
fout.close();
return 0;
}