Pagini recente » Cod sursa (job #706408) | Cod sursa (job #1270911) | Cod sursa (job #2522710) | Cod sursa (job #1253810) | Cod sursa (job #1205661)
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <vector>
#include <ctype.h>
#define inf 1000000000
using namespace std;
int i,n,m,*d,lg,j,k,sw,*arcx,*arcy,*arcc;
long long nr;
char *F;
struct graf
{
int y,c;
bool f;
}g;
vector< graf > G[50005];
class comp
{
public:
bool operator() (const int &a, const int &b)
{
return d[a]>d[b];
}
};
priority_queue<int, vector<int>, comp> H;
void init()
{
int x,y,c;
fseek(stdin,0,SEEK_END);
lg=ftell(stdin);
rewind(stdin);
F=(char*) calloc(lg+1,sizeof(char));
fread(F,sizeof(char),lg,stdin);
for (i=0;isdigit(F[i]);i++) n=n*10+F[i]-'0';
j=i+1;
for (i=j;isdigit(F[i]);i++) m=m*10+F[i]-'0';
arcx=(int*) calloc(m+1,sizeof(int));
arcy=(int*) calloc(m+1,sizeof(int));
arcc=(int*) calloc(m+1,sizeof(int));
for (k=1;k<=m;k++)
{
x=y=c=0;
j=i+1; sw=0;
if (F[j]=='-') {sw=1; j++;}
for (i=j;isdigit(F[i]);i++) x=x*10+F[i]-'0';
if (sw) x*=-1;
j=i+1; sw=0;
if (F[j]=='-') {sw=1; j++;}
for (i=j;isdigit(F[i]);i++) y=y*10+F[i]-'0';
if (sw) y*=-1;
j=i+1; sw=0;
if (F[j]=='-') {sw=1; j++;}
for (i=j;isdigit(F[i]);i++) c=c*10+F[i]-'0';
if (sw) c*=-1;
g.y=y; g.c=c; g.f=0;
G[x].push_back(g);
arcx[k]=x; arcy[k]=y; arcc[k]=c;
}
free(F);
d=(int*) calloc(n+1,sizeof(int));
for (i=1;i<=n;i++) d[i]=inf;
}
void bellmanford(int s)
{
int i,j;
for (i=1;i<=m;i++)
if (arcx[i]==s) d[arcy[i]]=arcc[i];
d[s]=0;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (d[arcy[i]]>d[arcx[i]]+arcc[i])
d[arcy[i]]=d[arcx[i]]+arcc[i];
}
bool verif_negativ()
{
int i;
for (i=1;i<=m;i++)
if (d[arcy[i]]>d[arcx[i]]+arcc[i]) return true;
return false;
}
int main()
{
freopen ("bellmanford.in","r",stdin);
freopen ("bellmanford.out","w",stdout);
init();
bellmanford(1);
if (verif_negativ()) printf("Ciclu negativ!");
else
for (i=2;i<=n;i++) printf("%i ",d[i]);
fclose(stdin);
fclose(stdout);
return 0;
}