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;
}
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;
}
相关文章推荐
- 51nod--1459 迷宫游戏 (dijkstra)
- 51nod 1459 迷宫游戏 dijkstra变形
- 51Nod - 1459 迷宫游戏 dijkstra拓展
- 51nod 1459 迷宫游戏(Dijkstra)
- 51Nod 1459 迷宫游戏 dijkstra拓展
- 51Nod 1459 迷宫游戏 (dijkstra)
- 51Nod 1459 迷宫游戏(dijkstra)
- 51nod 1459 迷宫游戏Dijkstra变形
- 51Nod 1459 迷宫游戏
- (老弱病残康复训练)51nod 1459 迷宫游戏(最短路)
- 51nod 1459 迷宫游戏
- 51nod 1459 迷宫游戏
- 51nod 1459 迷宫游戏
- 51NOD 1459 迷宫游戏
- 51Nod-1459 迷宫游戏(dij算法)
- 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)
- 51nod 1459 迷宫游戏 最短路
- 51nod_1459_迷宫游戏_最短路
- 51Nod - 1459 迷宫游戏
- 51nod 1459 迷宫游戏(bfs)