传送门
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;
}