Pagini recente » Cod sursa (job #2607728) | Cod sursa (job #2422522) | Cod sursa (job #714119) | Cod sursa (job #2392006) | Cod sursa (job #1166694)
#include <fstream>
#include <vector>
using namespace std;
const char InFile[] = "dijkstra.in";
const char OutFile[] = "dijkstra.out";
const int MaxN = 50111;
const int AINT_SIZE = MaxN * 4;
const int INF = 1<<30;
ifstream fin(InFile);
ofstream fout(OutFile);
struct AINT_NODE
{
int val, node;
};
struct EdgeTo
{
EdgeTo(int to=0, int cost=0):to(to),cost(cost){}
int to, cost;
};
int N, M, x, y, cost, D[MaxN], viz[MaxN];
AINT_NODE AINT[AINT_SIZE];
vector<EdgeTo> G[MaxN];
void Init(int nod, int st, int dr)
{
if (st == dr)
{
AINT[nod].val = D[st];
AINT[nod].node = st;
return;
}
int mid = (st+dr)>>1;
int left = nod << 1;
int right = left + 1;
Init(left,st,mid);
Init(right,mid+1,dr);
AINT[nod] = AINT[right];
if (AINT[left].val < AINT[right].val)
{
AINT[nod] = AINT[left];
}
}
int update_node, update_val;
void Update(int nod, int st, int dr)
{
if (st == dr)
{
AINT[nod].val = update_val;
return;
}
int mid = (st+dr)>>1;
int left = nod<<1;
int right = left + 1;
if (update_node <= mid)
{
Update(left, st, mid);
}
else
{
Update(right, mid + 1, dr);
}
AINT[nod] = AINT[right];
if (AINT[left].val < AINT[right].val)
{
AINT[nod] = AINT[left];
}
}
int main()
{
fin >> N >> M;
for (register int i = 1; i <= M; ++i)
{
fin >> x >> y >> cost;
G[x].push_back(EdgeTo(y, cost));
G[y].push_back(EdgeTo(x, cost));
}
fin.close();
for (register int i = 2; i <= N; ++i)
{
D[i] = INF;
}
Init(1,1,N);
while (AINT[1].val!=INF)
{
int node = AINT[1].node;
update_node = node;
update_val = INF;
Update(1,1,N);
viz[node] = 1;
for (vector<EdgeTo>::iterator it = G[node].begin(); it != G[node].end(); ++it)
{
if (!viz[it->to])
{
if (D[it->to] > D[node] + it->cost)
{
D[it->to] = D[node] + it->cost;
update_node = it->to;
update_val = D[it->to];
Update(1,1,N);
}
}
}
}
for (register int i = 2; i <= N; ++i)
{
fout << D[i] << " ";
}
fout.close();
return 0;
}