#include <iostream>
#include <vector>
#include <limits>
using namespace std;
struct FordEdge{
int u;
int v;
int w;
};
int const N = 5;
vector<FordEdge> es;
int dis[N];
int parents[N];
int costs[N][N] = {{0 ,6 ,7 ,INT_MAX,INT_MAX},
{INT_MAX,0 ,8 ,5 ,-4 },
{INT_MAX,INT_MAX,0 ,-3 ,9 },
{INT_MAX,-2 ,INT_MAX,0 ,INT_MAX},
{2 ,INT_MAX,INT_MAX,7 ,0 }};
void initialize(){
for(int i = 0 ; i < N ; ++i){
dis[i] = INT_MAX;
parents[N] = -1;
for(int j = 0; j < N ; ++j){
if(0!=costs[i][j]&&INT_MAX!=costs[i][j]){
FordEdge e;
e.u = i;
e.v = j;
e.w = costs[i][j];
es.push_back(e);
}
}
}
dis[0] = 0;
}
void relax(FordEdge& e){
if(dis[e.v]>dis[e.u]+e.w){
dis[e.v]=dis[e.u]+e.w;
parents[e.v] = e.u;
}
}
void printDis(){
for(int k = 0 ; k < N; ++k)
cout<<dis[k]<<' ';
cout<<endl;
}
bool Bellman_Ford(){
initialize();
printDis();
for(int i = 0 ; i < N-1 ; ++i){
for(int j = 0 ; j < es.size(); ++j)
relax(es[j]);
printDis();
}
// check circle of the route
vector<FordEdge>::iterator it = es.begin();
while(it!=es.end()){
if(dis[it->v]>dis[it->u]+it->w)
return false;
++it;
}
return true;
}
int main(){
if(Bellman_Ford())
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
for(int i = 1 ; i < N ; ++i){
cout<<parents[i]<<"->"<<i<<endl;
}
cout<<INT_MAX<<endl;
system("PAUSE");
}