Cod sursa(job #560054)

Utilizator GeorgeGradinariuGradinariu George GeorgeGradinariu Data 18 martie 2011 12:09:40
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<fstream>
#include<vector>
using namespace std;

#define Nmax 50004
#define inf INT_MAX
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
struct nod{int val,nr;};

vector<nod>v[Nmax];
int N,M;
int pre[Nmax],viz[Nmax],cost[Nmax];

void citire()
{
	in>>N>>M;
	int i,j,k;
	nod p;
	for(i=1;i<=N;i++)
	{
		p.nr=i;
		p.val=0;
		v[i].push_back(p);
	}
	while(in>>i>>j>>k)
	{
		p.nr=j;
		p.val=k;
		v[i].push_back(p);
		p.nr=i;
		p.val=k;
		v[j].push_back (p);
		
	}
	in.close();
}


void djk()
{
	int i,j,vfmin,dmin;
	for(i=1;i<=N;i++)
	{
		cost[i]=inf;
		pre[i]=1;
	}
	for(i=1;i<v[1].size();i++)
	{
		cost[v[1][i].nr]=v[1][i].val;
	}
	viz[1]=1;
	pre[1]=0;
	
	for(j=1;j<=N;j++)
	{
		dmin=inf;
		for(i=1;i<v[j].size();i++)
		{
			if(!viz[v[j][i].nr]&&cost[v[j][i].nr]<dmin)
			{
				dmin=cost[v[j][i].nr];
				vfmin=v[j][i].nr;
			}
		}
		
		viz[vfmin]=1;
		for(i=1;i<v[vfmin].size();i++)
		{
			if(!viz[v[vfmin][i].nr]&&cost[v[vfmin][i].nr]>dmin+v[vfmin][i].val)
			{
				pre[i]=vfmin;
				cost[v[vfmin][i].nr]=dmin+v[vfmin][i].val;
				
			}
		}
	}
	
	
}
int main()
{
	citire();
	djk();
	/*for(int i=1;i<=N;i++)
	{
		for(int j=0;j<v[i].size();j++)
		
			out<<v[i][j].nr<<" "<<v[i][j].val<<" ";
		out<<endl;
	}*/
		
	for(int i=2;i<=N;i++)
		out<<cost[i]<<" ";
	out.close();
}