Pagini recente » Cod sursa (job #399787) | Cod sursa (job #893581) | Cod sursa (job #2886902) | Rating qqqqq qqqqq (qqqqq) | Cod sursa (job #1267687)
#include <cstdio>
#include <vector>
#define nmax 50005
#define INF (50000*1000)
using namespace std;
FILE*fin=fopen("dijkstra.in", "r");
FILE*fout=fopen("dijkstra.out", "w");
int n, m, x0;
struct vecin{
int vf;
short cost;
};
vector <vecin> gr[nmax];
int cmin[nmax], prec[nmax];
bool uz[nmax];
void citire();
void init();
void dijkstra(int);
void afisare();
int main(){
citire();
x0=1; //in cazul de pe infoarena
init();
dijkstra(x0);
afisare();
return 0;
}
void citire(){
int x, y, c;
vecin aux;
fscanf(fin, "%d%d", &n, &m);
for(int i=1; i<=m; ++i){
fscanf(fin, "%d%d%d", &x, &y, &c);
aux.vf=y; aux.cost=c;
gr[x].push_back(aux);
aux.vf=x;
gr[x].push_back(aux);
}
}
void init(){
int i;
uz[x0]=1;
for(i=1; i<=n; ++i){
prec[i]=x0;
cmin[i]=INF;
}
prec[x0]=0;
cmin[x0]=INF;
for(i=0; i<gr[x0].size(); ++i)
cmin[gr[x0][i].vf]=gr[x0][i].cost;
}
void dijkstra(int vfS){
int i;
for(i=0; i<gr[vfS].size(); ++i){
cmin[gr[vfS][i].vf]=gr[vfS][i].cost;
prec[gr[vfS][i].vf]=vfS;
}
int minim, vfMin, j;
vecin y;
for(i=1; i<=n-1; ++i){
//determin un vf neselectat de cost minim
minim=vfMin=INF;
for(j=1; j<=n; ++j)
if(minim>cmin[j] && !uz[j]){
minim=cmin[j];
vfMin=j;
}
if(vfMin==INF) break;
uz[vfMin]=1;
for(j=0; j<gr[vfMin].size(); ++j){
y=gr[vfMin][j];
if(!uz[y.vf] && cmin[y.vf]>cmin[vfMin]+y.cost){
cmin[y.vf]=cmin[vfMin]+y.cost;
prec[y.vf]=vfMin;
}
}
}
}
void afisare(){
for(int i=1; i<=n; ++i)
if(i!=x0){
if(cmin[i]!=INF) fprintf(fout, "%d ", cmin[i]);
else fprintf(fout, "0 ");
}
fprintf(fout, "\n");
}