赞
踩
PTA旅游规划
题意就是给你一些点和边,告诉你两个点之间的距离和价钱,求从起点到终点最短的路径和对应的价钱,如果有多条相同大小的路径,则求出最小的价钱的路径。
可以用dijkstra+优先队列来求解,在原来的基础上增加价值这个权重就好。
#include<bits/stdc++.h> using namespace std; const int maxn=510; int d[maxn],vis[maxn],c[maxn]; int n,m,st,ed; struct node{ int v,w,cost; node(int a,int b,int c){ v=a; w=b; cost=c; } bool operator <(const node &n)const{ if(w==n.w)return cost>n.cost;//价钱从小到大 else return w>n.w;//距离从小到大 } }; vector<node>adj[maxn]; priority_queue<node>q; void dijkstra() { memset(d,0x3f,sizeof(d)); d[st]=0; c[st]=0; q.push(node(st,d[st],c[st])); while(!q.empty()){ int u=q.top().v; q.pop(); if(u==ed)return ; if(vis[u])continue; vis[u]=1; for(int i=0;i<adj[u].size();i++){ int x=adj[u][i].v; int y=adj[u][i].w; int z=adj[u][i].cost; if(d[x]>d[u]+y){ d[x]=d[u]+y; c[x]=c[u]+z; q.push(node(x,d[x],c[x])); } else if(d[x]==d[u]+y&&c[x]>c[u]+z){ c[x]=c[u]+z; //d[x]=d[u]+y;这句可要可不要。 q.push(node(x,d[x],c[x])); } } } } int main(){ cin>>n>>m>>st>>ed; for(int i=0;i<m;i++) { int a,b,c,d; cin>>a>>b>>c>>d; adj[a].push_back(node(b,c,d)); adj[b].push_back(node(a,c,d)); } dijkstra(); cout<<d[ed]<<" "<< c[ed]<<endl; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。