HDU3790最短路径问题优先队列

传送门
hdu3790
在这里插入图片描述
在这里插入图片描述
这道题不仅要求最短距离而且还需要求最少路费 在更新路径距离的时候也需要对路费进行更新 只不过需要注意的一点是 当距离相同是路费最少是最优选择
AC代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+7;
typedef pair<int,int> pii;
vector<pii>edge1[maxn];
vector<pii>edge2[maxn];
const int inf=0x3f3f3f3f;
int dis[maxn],cost[maxn],n,m;
priority_queue<pii,vector<pii>,greater<pii> >q;
void dijastra(int x,int y)
{
	memset(dis,inf,sizeof(dis));
	memset(cost,inf,sizeof(cost));
	dis[x]=0;
	cost[x]=0;
	q.push(pii(0,x));
	while(!q.empty())
	{
		pii t=q.top();
		q.pop();
		int point=t.second;
		if(t.first>dis[point])
		{
			continue;
		}
		for(int i=0;i<edge1[point].size();i++)
		{
			int p=edge1[point][i].first;
			int v=edge1[point][i].second;
			int cost1=edge2[point][i].second;
			if(dis[point]+v<dis[p])
			{
				dis[p]=dis[point]+v;
				cost[p]=cost[point]+cost1;
				q.push(pii(dis[p],p));
			}
			if(dis[point]+v==dis[p]&&cost[p]>cost[point]+cost1)		
			{
				dis[p]=dis[point]+v;
				cost[p]=cost[point]+cost1;
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		edge1[i].clear();
		edge2[i].clear();
	}
}
int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		if(n==0&&m==0) return 0;
		int a,b,d,p,s,t;
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d%d%d",&a,&b,&d,&p);
			edge1[a].push_back(make_pair(b,d));
			edge1[b].push_back(make_pair(a,d));
			edge2[a].push_back(make_pair(b,p));
			edge2[b].push_back(make_pair(a,p));
		}
		scanf("%d%d",&s,&t);
		dijastra(s,t);
		printf("%d %d\n",dis[t],cost[t]);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值