hdoj2544最短路大水题+优先队列优化dij算法

优先队列能优化很多东西,之前写的很多题都没有试过优先队列的优化,现在回来想写写看,先上个水题。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544


题意:就是n个点m条路,找到从1到n的最短路输出即可,dij大水题,拿来热身倒是很合适。

AC代码:

#include<bits/stdc++.h>
#define INF 0x3F3F3F3F
#define endl '\n'
#define sxh(i,a,b) for(int i=(a);i<=(b);i++)
#define xxh(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
#define css(n) cout<<setiosflags(ios::fixed)<<setprecision(n); 
#define sd(a) scanf("%d",&a)
#define sld(a) scanf("%lld",&a)
#define m(a,b) memset(a,b,sizeof a)
#define p_queue priority_queue 
using namespace std;
typedef long long ll;
const int maxn=105;
int n,m,s;
int t;
double a,b;
struct node
{
	int to;
	int len;
};
vector<node> edge[maxn];
ll dis[maxn];
int vis[maxn];
p_queue<pair<int, int> > pq;//小根堆,前面的int是dist相反数,后面是节点编号 
void dij(int s)
{
	for(int i=1;i<=n;i++)
	{
		dis[i]=INF;
	}
	memset(vis,0,sizeof(vis));
	dis[s]=0;
	pq.push(make_pair(0,s));
	while(!pq.empty())
	{
		int x=pq.top().second;
		pq.pop();
		if(vis[x]) continue;
		vis[x]=1;
		for(int i=0;i<edge[x].size();i++)
		{
			int y=edge[x][i].to;
			if(dis[y]>dis[x]+edge[x][i].len)//松弛 
			{
				dis[y]=dis[x]+edge[x][i].len;
				pq.push(make_pair(-dis[y],y));
			}
		}
	 } 
}
int main()
{
	while(scanf("%d%d",&n,&m)&&n&&m)
	{ 
	for(int i=1;i<=n;i++)
	{
		edge[i].clear();
	}
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		sd(a);sd(b);sd(c);
		node aa,bb;
		aa.to=b;
		aa.len=c;
		edge[a].pb(aa);
		bb.to=a;
		bb.len=c;
		edge[b].pb(bb);
	}
	dij(1);
	printf("%lld\n",dis[n]);
	} 
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值