Cod sursa(job #1541348)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 3 decembrie 2015 22:33:33
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>

#define NMax 1510
#define INF 2000000000

using namespace std;

ifstream f("dmin.in");
ofstream g("dmin.out");

int nodes, edges, distances[NMax], roadsNum[NMax];
vector < pair<int, int> > G[NMax];
queue <int> QU;
bool mark[NMax], isInQu[NMax];

class cmp {
public:
	bool operator() (pair<int, int> d1, pair<int, int> d2)
	{
		return d1.second > d2.second;
	}
};
priority_queue< pair<int, int>, vector< pair<int, int> >, cmp > H;

void dijkstra(int node)
{
	for (int i = 2; i <= nodes; i++)
		distances[i] = INF;

	H.push(make_pair(node, 0));

	while (!H.empty()) {
		int crtNode = H.top().first;
		mark[crtNode] = true;
		H.pop();

		for (vector < pair<int, int> >::iterator it = G[crtNode].begin(); it != G[crtNode].end(); it++) {
			if (!mark[it->first] && distances[it->first] > distances[crtNode] + it->second) {
				distances[it->first] = distances[crtNode] + it->second;
				H.push(make_pair(it->first, distances[it->first]));
			}
		}
	}
}

void BFS(int node)
{
	QU.push(node);
	mark[node] = true;
	isInQu[node] = true;
	roadsNum[node] = 1;


	while (!QU.empty()) {
		int crtNode = QU.front();
		mark[crtNode] = true;
		QU.pop();

		for (vector < pair<int, int> >::iterator it = G[crtNode].begin(); it != G[crtNode].end(); it++) {
			if (!mark[it->first] && distances[it->first] == distances[crtNode] + it->second) {
				if (!isInQu[it->first]) {
					QU.push(it->first);
					isInQu[it->first] = true;
				}
				
				roadsNum[it->first] += roadsNum[crtNode];
			}
		}
	}
}

int main()
{
	f >> nodes >> edges;
	
	int n1, n2, c;
	for (int i = 1; i <= edges; i++) {
		f >> n1 >> n2 >> c;
		
		G[n1].push_back(make_pair(n2, c));
		G[n2].push_back(make_pair(n1, c));
	}

	dijkstra(1);

	memset(mark, 0, sizeof(mark));

	BFS(1);

	for (int i = 2; i <= nodes; i++)
		g << roadsNum[i] << " ";

	return 0;
}