Cod sursa(job #721634)

Utilizator Dragan_ValentinDragan Valentin Dragan_Valentin Data 23 martie 2012 22:07:34
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <iostream>
#include <cstdio>
#include <bitset>
#include <vector>

const long infinit=2000000000;

using namespace std;

int main()
{
	
	int n,m,x,y,z,i;
	ifstream f("dijkstra.in");
	f>>n>>m;
	/*int drum[1000];
	bitset <1000> selected;
	int a[300][300];
	int parinte[1000];*/
	vector <int> drum;         // }
 	vector <short> selected; //  }
	vector <int> parinte;    //   }
	vector <vector<int> > a;
	drum.reserve(n+1);
	selected.reserve(n+100);
	parinte.reserve(n+100);
	a.reserve(n+100);
	for (i=0; i<n+100; i++)
		a[i].reserve(n+100);
	for (i=0; i<m; i++) {
		f>>x>>y>>z;
		a[x][y]=z;
	}
	f.close();
	for (i=1; i<=n; i++) {
		drum[i]=infinit;
		parinte[i]=1;
		selected[i]=0;
	}
	drum[1]=0;
	int dmin,nmin;
	while (true) {
		dmin=infinit;
		for (i=1; i<=n; i++)
			if (drum[i]<dmin && selected[i]==0) {
				dmin=drum[i];
				nmin=i;
			}
		if (dmin==infinit) break;
		selected[nmin]=1;
		for (i=1; i<=n; i++)
			if (a[nmin][i]!=0 && selected[i]==0 && dmin+a[nmin][i]<drum[i]) {
				drum[i]=dmin+a[nmin][i];
				parinte[i]=nmin;
			}
	}
	freopen("dijkstra.out","w",stdout);
	for (i=2; i<=n; i++) 
		if (drum[i]==infinit) printf("%d ",0);
		else printf("%d ",drum[i]);
	return 0;
}