Pagini recente » Cod sursa (job #670783) | Cod sursa (job #2475662) | Cod sursa (job #882253) | Cod sursa (job #1521313) | Cod sursa (job #1978351)
#include<fstream>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#define INF 0x3f3f3f3f
#define NMAX 12000
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
vector<pair<int,int> > v[NMAX];
int dist[NMAX];
struct comparator
{
bool operator() ( const pair<int,int>& left, const pair<int,int>& right) const
{
return left.first < right.first;
}
};
set< pair<int,int>,comparator > edges;
set< pair<int,int> > ::iterator it;
set< pair<int,int> > ::iterator ij;
void read_data(int &n,int &m)
{
int node1,node2,weight;
int i;
in >> n >> m;
for( i = 0 ; i < m ; ++i)
{
in>>node1>>node2>>weight;
v[node1].push_back(make_pair(weight,node2));
v[node2].push_back(make_pair(weight,node1));
}
}
void set_distances(int root, int n)
{
int i;
for(i = 1 ; i <= n ; ++i)
dist[i] = INF;
dist[root] = 0;
}
void Dijkstra(int root, int n)
{
pair<int,int> temp;
int fiu,cost;
int i;
set_distances(root,n);
edges.insert(make_pair(0,root));
while(!edges.empty())
{
it = edges.begin();
for( i = 0 ; i < v[(*it).second].size(); ++i)
{
fiu = v[(*it).second][i].second;
cost = (*it).first + v[(*it).second][i].first;
if(dist[fiu] > cost)
{
dist[fiu ] = cost;
temp = make_pair(cost,fiu);
ij = edges.find(temp);
if(ij == edges.end())
edges.insert(temp);
else
{
edges.erase(ij);
edges.insert(temp);
}
}
}
edges.erase(it);
}
for ( i = 2 ; i<=n ; ++i)
{
if(dist[i] == INF)
out<<"0 ";
else
out<<dist[i]<<' ';
}
return ;
}
int main()
{
int n,m;
read_data(n,m);
Dijkstra(1,n);
return 0;
}