51Nod 迷宫游戏
2017-08-27 17:17
274 查看
这道题要求的是一个给定起点到终点的所需移动距离和获得分数,像这样每组指定只有两个点的用Dijkstra比Floyd方便,我已开始没考虑清楚他们的操作步骤,误以为Dijkstra只能求一点到所有点走一遍的距离,只要给定参数用它求两定点距离一样方便。
这道题目就是当通过的距离不同时,取小的,当相同时,再比较分数大的
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459
下面给出代码,Floyd算法要注意起点与终点为同一点时分数为该点的分数,距离为0,要特殊考虑,而Dijkstra算法则没有这个问题。
Dijkstra
这道题目就是当通过的距离不同时,取小的,当相同时,再比较分数大的
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459
下面给出代码,Floyd算法要注意起点与终点为同一点时分数为该点的分数,距离为0,要特殊考虑,而Dijkstra算法则没有这个问题。
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define maxn 505 typedef long long ll; int map1[maxn][maxn]; int map2[maxn][maxn]; int m,n,start,ed; int a,b,c; int point[maxn]; void Floyd() { for(int k=0;k<m;k++) for(int i=0;i<m;i++) for(int j=0;j<m;j++) if(map1[i][j] > map1[i][k]+map1[k][j]) { map1[i][j]=map1[i][k]+map1[k][j]; map2[i][j]=map2[i][k]+map2[k][j]-point[k]; } else if(map1[i][j] == map1[i][k]+map1[k][j]) { if(map2[i][j] < map2[i][k]+map2[k][j]-point[k]) map2[i][j]=map2[i][k]+map2[k][j]-point[k]; } } int main() { while(scanf("%d%d%d%d",&m,&n,&start,&ed)!=EOF) { memset(map1,0x3f3f3f3f,sizeof(map1)); memset(map2,0,sizeof(map2)); for(int i=0;i<m;i++) scanf("%d",&point[i]); for(int i=0;i<n;i++) { scanf("%d%d%d",&a,&b,&c); map2[a][b]=map2[b][a]=point[b]+point[a]; if(c<map1[a][b]) map1[a][b]=map1[b][a]=c; } if(start==ed) map1[start][ed]=0,map2[start][ed]=point[start]; else Floyd(); printf("%d %d\n",map1[start][ed],map2[start][ed]); } return 0; }
Dijkstra
#include<stdio.h> #include<string.h> #include<algorithm> #include<stdlib.h> #include<iostream> using namespace std; #define inf 0x3f3f3f3f #define maxn 505 typedef long long ll; int map[maxn][maxn]; int book[maxn],dis[maxn],val[maxn],value[maxn]; int points,edges,start,end; int a,b,c; void Dijkstra(int start,int end) { for(int i=0;i<points;i++) dis[i]=map[start][i]; dis[start]=0; value[start]=val[start]; for(int i=0;i<points;i++) { int min=inf,min_index=start; for(int j=0;j<points;j++) { if(dis[j]<min && book[j]==0) { min=dis[j]; min_index=j; } } book[min_index]=1; for(int j=0;j<points;j++) { if(dis[j] > min+map[min_index][j]) { dis[j]=min+map[min_index][j]; value[j]=value[min_index]+val[j]; } else if(dis[j] == min+map[min_index][j]) { value[j]=max(value[j],value[min_index]+val[j]); } } } printf("%d %d\n",dis[end],value[end]); } int main() { while(scanf("%d%d%d%d",&points,&edges,&start,&end)!=EOF) { memset(book,0,sizeof(book)); memset(map,0x3f,sizeof(map)); memset(val,0,sizeof(val)); memset(dis,0,sizeof(dis)); memset(value,0,sizeof(value)); for(int i=0;i<points;i++) scanf("%d",&val[i]); for(int i=0;i<edges;i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) map[a][b]=map[b][a]=c; } Dijkstra(start,end); } return 0; }有什么可以改正的地方还望多多斧正
相关文章推荐
- 51nod 1459 迷宫游戏
- 迷宫游戏 51Nod - 1459 【最短路变形】
- 51nod 1459 迷宫游戏(bfs与djsk)
- 51nod 1459 迷宫游戏
- 51Nod-1459 迷宫游戏(dij算法)
- 51nod 1459 迷宫游戏
- 51NOD 1459 迷宫游戏
- 51nod 1459 迷宫游戏 最短路
- 51nod 1459 迷宫游戏 dijkstra变形
- 51Nod - 1459 迷宫游戏 dijkstra拓展
- 51Nod 1459 迷宫游戏(dijkstra)
- 51nod 1459 迷宫游戏(最短路)
- 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)
- 51nod 1459 迷宫游戏(最短路)
- 51Nod - 1459 迷宫游戏(未优化的djkstra)
- 51nod 1459 迷宫游戏
- 51Nod 1459 迷宫游戏
- 51nod 1459 迷宫游戏
- 51nod 1459 迷宫游戏(迪杰特斯拉Dijkstra算法)
- 51Nod 1459 迷宫游戏