Nu aveti permisiuni pentru a descarca fisierul grader_test1.ok
Cod sursa(job #1133090)
Utilizator | Data | 4 martie 2014 13:43:05 | |
---|---|---|---|
Problema | Algoritmul lui Dijkstra | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.29 kb |
#include<fstream>
#define M 2000000000
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
struct nod
{
int inf,c;
nod* leg;
};
typedef nod* PNod;
PNod L[10001];
int cost[100001],viz[100001],n,m;
void add(int x,int y,int z)
{
PNod p=new nod;
p->inf=y;
p->c=z;
p->leg=L[x];
L[x]=p;
}
void citire()
{
int i,x,y,z;
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y>>z;
add(x,y,z);
}
}
void completeaza()
{
for(int i=2;i<=n;i++)
cost[i]=M;
PNod p;
for(p=L[1];p;p=p->leg)
cost[p->inf]=p->c;
}
void afisare()
{
for(int i=2;i<=n;i++)
if(cost[i]==M)
g<<"0 ";
else g<<cost[i]<<" ";
}
void dijkstra()
{
completeaza();
int poz,valmin,i,j;
PNod p;
viz[1]=1;
for(i=1;i<=n-1;i++)
{
valmin=M;
for(j=2;j<=n;j++)
if(viz[j]==0&&cost[j]<valmin)
{
valmin=cost[j];
poz=j;
}
viz[poz]=1;
for(p=L[poz];p;p=p->leg)
if(!viz[p->inf]&&cost[p->inf]>cost[poz]+p->c)
cost[p->inf]=cost[poz]+p->c;
}
afisare();
}
int main()
{
citire();
dijkstra();
return 0;
}