图算法总结——Dijkstra算法

版权声明:本文为博主原创文章,未经博主允许可以随便转载。 https://blog.csdn.net/liyuanshuo_nuc/article/details/63307231
//
// Created by liyuanshuo on 2017/3/14.
//
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>

const int Max = 100010;
const int INF = 0x7fffffff;
int ns, ms;
int first[Max];
int ua[Max], va[Max], wa[Max], next[Max];

void read_graph( )
{
	std::cin>>ns>>ms;
	for (int i = 0; i < ns; ++i)
	{
		first[i] = -1;
	}
	for (int j = 0; j < ms; ++j)
	{
		std::cin>>ua[j]>>va[j]>>wa[j];
		next[j] = first[ua[j]];
		first[ua[j]] = j;
	}
}

struct Edage
{
	int from;
	int to;
	int dist;
	Edage( int u, int v, int d ) : from(u), to(v), dist(d) { }
};

struct HeapNode
{
	int d, u;
	bool operator < ( const HeapNode& rhs ) const
	{
		return d > rhs.d;
	}
};

struct Dijkstra
{
	int n, m;
	std::vector<Edage> edges;
	std::vector<int> G[Max];
	bool done[Max];
	int d[Max];
	int p[Max];
	
	void init( int n )
	{
		this->n = n;
		for (int i = 0; i < n ; ++i)
		{
			G[i].clear ();
		}
		edges.clear ();
	}
	
	void AddEdge( int from, int to, int dist )
	{
		edges.push_back (Edage(from, to, dist));
		m = edges.size ();
		G[from].push_back ( m-1 );
	}
	
	void dijkstra( int s )
	{
		std::priority_queue<HeapNode> Q;
		for (int i = 0; i < n; ++i)
		{
			d[i] = INF;
		}
		d[s] = 0;
		memset (done, 0, sizeof (done));
		Q.push ( (HeapNode){0,s});
		while ( !Q.empty ())
		{
			HeapNode x = Q.top ();
			Q.pop ();
			int u = x.u;
			if( done[u] )
				continue;
			done[u] = true;
			for (int i = 0; i < G[u].size (); ++i)
			{
				Edage& e = edges[G[u][i]];
				if( d[e.to] > d[u] + e.dist )
				{
					d[e.to] = d[u] + e.dist;
					p[e.to] = G[u][i];
					Q.push ( (HeapNode) { d[e.to], e.to });
				}
			}
		}
	}
};

猜你喜欢

转载自blog.csdn.net/liyuanshuo_nuc/article/details/63307231