Pagini recente » Cod sursa (job #234007) | Cod sursa (job #1586899) | Cod sursa (job #430170) | Statistici Ungureanu Liviu (Liviuu23) | Cod sursa (job #1541548)
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
#include <cmath>
#define NMax 1510
#define INF 2000000000
#define eps 0.0000000001
using namespace std;
ifstream f("dmin.in");
ofstream g("dmin.out");
int nodes, edges, roadsNum[NMax];
double distances[NMax];
vector < pair<int, double> > G[NMax];
queue <int> QU;
bool mark[NMax], isInQu[NMax];
class cmp {
public:
bool operator() (pair<int, double> d1, pair<int, double> d2)
{
return d1.second > d2.second;
}
};
priority_queue< pair<int, double>, vector< pair<int, double> >, 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, double> >::iterator it = G[crtNode].begin(); it != G[crtNode].end(); it++) {
if (!mark[it->first] && distances[it->first] - (distances[crtNode] + it->second) > eps) {
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, double> >::iterator it = G[crtNode].begin(); it != G[crtNode].end(); it++) {
if (!mark[it->first] && abs(distances[it->first] - (distances[crtNode] + it->second)) <= eps) {
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, log10(c)));
G[n2].push_back(make_pair(n1, log10(c)));
}
dijkstra(1);
memset(mark, 0, sizeof(mark));
BFS(1);
for (int i = 2; i <= nodes; i++)
g << roadsNum[i] << " ";
return 0;
}