Pagini recente » Cod sursa (job #1506036) | Cod sursa (job #2964690) | Cod sursa (job #1437339) | Cod sursa (job #2164465) | Cod sursa (job #1446558)
#include<fstream>
#include<cstring>
using namespace std;
const int MAXN = 50005;
const int INF = 0x3f3f3f3f;
typedef struct lnod{
int vf,cost;
struct lnod *next;
} *Nod;
/// folosim algoritmul lui bellman ford
Nod a[MAXN];
int Q[MAXN << 5]; // coada
bool viz[MAXN];
int D[MAXN];
int N, M; // nr de noduri, respectiv de muchii
void add(int x,int y,int c)
{ // adauga o muchie intre x si y de cost c
Nod p = new lnod;
p->vf = y;
p->cost = c;
p->next = a[x];
a[x] = p;
}
void readdata()
{
ifstream fin("bellmanford.in");
int i,x,y,z;
fin >> N >> M;
for(i=1;i<=M;++i)
{
fin>>x>>y>>z;
add(x,y,z);
}
fin.close();
}
void Bellman_Ford(){
int nod;
memset(D,INF,sizeof(D));
D[1] = 0;
int p = 0, u = 0;
Q[++ u] = 1;
viz[1]=1;
while(p <= u)
{
nod = Q[++ p];
viz[nod] = 0;
for(Nod p=a[nod];p;p=p->next)
if(D[nod] + p->cost < D[p->vf])
{
D[p->vf] = D[nod] + p->cost;
if(!viz[p->vf])
{
Q[++ u] = p->vf;
viz[p->vf]=1;
}
}
}
}
void writedata(){
ofstream fout("bellmanford.out");
for(int i=2;i<=N;++i)fout<<(D[i]!=INF?D[i]:0)<<' ';
fout.close();
}
int main(void){
readdata();
Bellman_Ford();
writedata();
return 0;
}