Pagini recente » Cod sursa (job #734515) | Cod sursa (job #2003667) | Cod sursa (job #1466041) | Cod sursa (job #1685444) | Cod sursa (job #1596535)
#include <fstream>
#include <vector>
#include <set>
#define DMAX 50004
#define INF 1000000000
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int n, m;
vector <pair <int, int> > vecin[DMAX];
set <pair <int, int> > distanta;
int dist[DMAX];
void citire();
void initializare();
void dijkstra();
void afisare();
int main()
{
citire();
initializare();
dijkstra();
afisare();
return 0;
}
void citire()
{
int i, x, v, c;
fin>>n>>m;
for(i=1;i<=m;++i)
{
fin>>x>>v>>c;
vecin[x].push_back(make_pair(v, c));
}
}
void initializare()
{
int i, lg;
for(i=2;i<=n;++i)
dist[i]=INF;
lg=vecin[1].size();
for(i=0;i<lg;++i)
{
dist[vecin[1][i].first]=vecin[1][i].second;
distanta.insert(vecin[1][i]);
}
}
void dijkstra()
{
int i, crt, vec, cost, lg;
pair <int, int> minim;
while(!distanta.empty())
{
minim.first=distanta.begin()->first;
minim.second=distanta.begin()->second;
distanta.erase(minim);
crt=minim.first;
lg=vecin[minim.first].size();
for(i=0;i<lg;++i)
{
vec=vecin[crt][i].first;
cost=vecin[crt][i].second;
if(dist[vec]>dist[crt]+cost)
{
distanta.erase(vecin[crt][i]);
dist[vec]=dist[crt]+cost;
distanta.insert(make_pair(vec, dist[vec]));
}
}
}
}
void afisare()
{
int i;
for(i=2;i<=n;++i)
{
if(dist[i]==INF)
dist[i]=0;
fout<<dist[i]<<' ';
}
fout<<'\n';
}
/*
FARA HEAP
#include <cstdio>
#include <vector>
#define NMAX 50004
#define INF 1000000000
using namespace std;
FILE*fin=fopen("dijkstra.in", "r");
FILE*fout=fopen("dijkstra.out", "w");
int n, m, x0;
struct vecin
{
int varf;
int cost;
};
vector <vecin> A[NMAX];
int cmin[NMAX], prec[NMAX];
bool Z[NMAX];
void citire();
void dijkstra();
void initializare();
void afisare();
int main()
{
citire();
dijkstra();
afisare();
return 0;
}
void citire()
{
int i, x, y, c;
vecin v;
fscanf(fin, "%d %d\n", &n, &m);
for(i=1;i<=m;i++)
{
fscanf(fin, "%d %d %d\n", &x, &y, &c);
v.varf=y; v.cost=c;
A[x].push_back(v);
}
x0=1;
initializare();
}
void initializare()
{
int i, lg;
for(i=1;i<=n;i++)
{
cmin[i]=INF;
prec[i]=x0;
}
cmin[x0]=0; prec[x0]=0; Z[x0]=1;
lg=A[x0].size();
for(i=0;i<lg;i++)
cmin[A[x0][i].varf]=A[x0][i].cost;
}
void dijkstra()
{
int i, j, lg;
int minim;
cmin[0]=INF;
for(i=2;i<=n;i++)
{
minim=0;
for(j=1;j<=n;j++)
if(!Z[j] && cmin[j]<cmin[minim])
minim=j;
if(!minim)
return;
Z[minim]=1;
lg=A[minim].size();
for(j=0;j<lg;j++)
if(!Z[A[minim][j].varf] && cmin[A[minim][j].varf]>cmin[minim]+A[minim][j].cost)
{
cmin[A[minim][j].varf]=cmin[minim]+A[minim][j].cost;
prec[A[minim][j].varf]=minim;
}
}
}
void afisare()
{
int i;
for(i=1;i<x0;i++)
if(cmin[i]==INF) fprintf(fout, "0 ");
else fprintf(fout, "%d ", cmin[i]);
for(i=x0+1;i<=n;i++)
if(cmin[i]==INF) fprintf(fout, "0 ");
else fprintf(fout, "%d ", cmin[i]);
fprintf(fout, "\n");
}
*/