hdu2544-Dijkstra算法(堆优化)

 hdu2544最短路

题意很容易理解,是经典的 Dijkstra算法,今天用堆优化的方法写了一遍,这里有我之前写的用数组存图的普通Dijkstra算法。

 堆优化用vector存图,能够解决二维数组不能开的太大的问题,pii first存的是距离,second存的是id。优先队列能够更快找到

最短路路径。 

ac代码如下(写的有些复杂): 

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const ll maxn=1e6;
const ll inf=0x3f3f3f3f;
int n,m;
vector<pii> v[maxn];
ll dis[maxn];
bool vis[maxn];
void dj()
{
	dis[1]=0;
	vis[1]=1;
	pii x,y,z;
	x.first=0;
	x.second=1;
	priority_queue<pii,vector<pii>,greater<pii> >q;//给pii排序时先排fist 其次second 
	q.push(x);
	while(!q.empty())
	{
		x=q.top();
		q.pop();
//		dis[x.second]=x.first;//注意,这行代码不能有 , 手动模拟代码下第三个 样例易理解 
		vis[x.second]=1;
		for(int i=0;i<v[x.second].size();i++)
		{
			y=v[x.second][i];
			if(vis[y.second]==0&&x.first+y.first<dis[y.second])
			{
				dis[y.second]=x.first+y.first;
				z.first=dis[y.second];
				z.second=y.second;
				q.push(z);
			}		
		}
	}
}
int main()
{
	while(~scanf("%d%d",&n,&m))
	{	int x,y,z;
		pii s;
		if(n==0&&m==0)
			break;
		for(int i=0;i<=n;i++)
		{
			dis[i]=inf;
			vis[i]=0;
			v[i].clear();
		 } 	
		for(int i=0;i<m;i++)
		{
			scanf("%d%d%d",&x,&y,&z);
			s.first=z,s.second=y;
			v[x].push_back(s);
			s.second=x;
			v[y].push_back(s);
		}
		dj();
		printf("%lld\n",dis[n]);
	}
	return 0;
}
/*
2 1
1 2 3

3 3
1 2 5
2 3 5
3 1 2

4 4
1 2 3
1 4 2
1 3 5
3 4 2
*/
发布了40 篇原创文章 · 获赞 2 · 访问量 858

猜你喜欢

转载自blog.csdn.net/qq_43851311/article/details/103258609