您的位置:首页 > 其它

51Nod 1459 迷宫游戏(Dijkstra)

2017-09-12 16:33 218 查看
题目链接

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: