Dijkstra

void Dijkstra(int u)
{
	memset(vis,0,sizeof(vis));
	for(int t=1;t<=n;t++)
	{
		dis[t]=map[u][t];
	}
	vis[u]=1;
	for(int t=1;t<n;t++)
	{
		int minn=Inf,temp;
		for(int i=1;i<=n;i++)
		{
			if(!vis[i]&&dis[i]<minn)
			{
				minn=dis[i];
				temp=i;
			}
		}
		vis[temp]=1;
		for(int i=1;i<=n;i++)
		{
			if(map[temp][i]+dis[temp]<dis[i])
			{
				dis[i]=map[temp][i]+dis[temp];
			}
		}
	}
	
}
const int maxn=1e6+10;
const int maxm=1e7+10;
const int inf=0x3f3f3f3f;
struct Dijkstra
{
	struct Edge
	{
		int next,  to ,w;
	} e[maxm];
	int head[maxn],v[maxn],d[maxn],tol;
	void add(int u, int v, int w)
	{
		tol++;
		e[tol].to = v;
		e[tol].next = head[u];
		e[tol].w = w;
		head[u] = tol;
	}
	priority_queue<pair<long long,int>,vector<pair<long long,int> >,greater<pair<long long,int> > >q1;
	int dijkstra(int s,int t)
	{
		memset(d,inf,sizeof(d));
		memset(v,0,sizeof(v));
		d[s] = 0;
		q1.push(make_pair(0, s));
		while (!q1.empty())
		{
			int x = q1.top().second;
			q1.pop();
			if (!v[x])
			{
				v[x] = 1;
				for (register int i = head[x]; i; i = e[i].next)
				{
					int to=e[i].to;
					if (d[to] > d[x] + e[i].w)
					{
						d[to] = d[x] + e[i].w;
						q1.push(make_pair(d[to], to));
					}
				}
			}
		}
		return d[t];
	}

	void init()
	{
		memset(head, 0, sizeof(head));
		tol = 0;
	}
} H;

  

原文地址:https://www.cnblogs.com/Accpted/p/11191827.html