51Nod 1459 迷宫游戏(Dijkstra)

来源:互联网 发布:安卓浏览器查看源码 编辑:程序博客网 时间:2024/05/16 18:52

题目链接

Dijkstra求最短路径,最短路径需要更新,时间直接累加

最短路径如果相同,比较时间

#include<iostream>#include<cstdio>#include<math.h>#include<cstring>#include<algorithm>#include<queue>#include<set>#include<vector>using namespace std;typedef pair<int,int> P;const int INF=1<<29;int time[1000]={0},grade[1000],fz[1000],v[1000]={0};int ma[501][501]={0};int n,m, start, end;void Dijkstra(int x){priority_queue<P, vector<P>, greater<P> > que;time[x]=0,grade[x]=fz[x];que.push({time[x],x});while(que.size()){P p=que.top();que.pop();int num=p.second;if(v[num]) continue;v[num]=1;for(int i=0;i<n;i++){if(ma[i][num]!=INF){if(time[i]>time[num]+ma[i][num]){   time[i]=time[num]+ma[i][num];   grade[i]=grade[num]+fz[i];   que.push({time[i],i});}else if(time[i]==time[num]+ma[i][num]){if(grade[i]<grade[num]+fz[i]) grade[i]=grade[num]+fz[i];}}}}}int main(){cin>>n>>m>>start>>end;for(int i=0;i<n;i++) cin>>fz[i];for(int i=0;i<n;i++){time[i]=INF;grade[i]=0;for(int j=0;j<n;j++) ma[i][j]=INF; }for(int i=0;i<m;i++){int a,b,c;cin>>a>>b>>c;ma[a][b]=ma[b][a]=c;}Dijkstra(start);cout<<time[end]<<" "<<grade[end];return 0;}