Sunday, 21 January 2018

Bellman Ford Algorithm C

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define max 100000009
int V;
bool bellmanford(int w[][V],int source);
void init(int p[],int s[],int source);
void relax(int i,int j,int w[][V],int p[],int s[]);
/*void print(int p[],int s[]){
int i=0;
for(;i<V;++i){
printf("%d %d\n",p[i],s[i]);
}

}*/
int main(void){
int E;
scanf("%d %d",&V,&E);
int w[V][V];int i,j,val;
for(i=0;i<V;++i){
for(j=0;j<V;++j)w[i][j]=max;
}
while(E>0){
scanf("%d %d %d",&i,&j,&val);
w[i][j]=val;
--E;
}
bool c=bellmanford(w,0);
if(c==true)printf("NO -ve Cycle\n");
else printf("-ve cycle present\n");

return 0;
}
bool bellmanford(int w[][V],int source){
int p[V],s[V];int i,j;
init(p,s,source);
int k=V;
while(k>1){
for(i=0;i<V;++i){
  for(j=0;j<V;++j){
if(w[i][j]!=max)
   relax(i,j,w,p,s);
}
}
--k;}
for(i=0;i<V;++i){
  for(j=0;j<V;++j){
if(w[i][j]!=max){
if(s[j]>s[i]+w[i][j])
   return false;
  }
 
}



} //print(p,s);
return true;
}
void init(int p[],int s[],int source){
int i=0;
for(;i<V;++i){
p[i]=-1;
s[i]=max;
}
s[source]=0;
}
void relax(int i,int j,int w[][V],int p[],int s[]){
if(s[j]>s[i]+w[i][j]){
s[j]=s[i]+w[i][j];
p[j]=i;
}
}

No comments:

Post a Comment