A
来源:互联网 发布:plc编程下载 编辑:程序博客网 时间:2024/06/10 05:02
点击打开链接
A - 我爱dijkstra
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
(1<n<=1000, 0<m<100000, s != t)
3 21 2 5 62 3 4 51 30 0
9 11
#include <cstdio>#include <cstring>#include<algorithm>using namespace std;const int maxn=1005;const int Max=0x3f3f3f3f;int s,t,i,j,m;int map[maxn][maxn],dis[maxn],money[maxn],visit[maxn],price[maxn][maxn],n;void dijkstral(){ int min,pos; memset(visit,0,sizeof(visit)); pos=s; visit[pos]=1; for(i=1;i<=n;i++) { dis[i]=map[pos][i]; money[i]=price[pos][i]; } for(i=0;i<n-1;i++) { min=Max; for(j=1;j<=n;j++) { if(!visit[j] && min>dis[j]) { min=dis[j]; pos=j; } } visit[pos]=1; for(j=1;j<=n;j++) { if(map[pos][j]<Max&&visit[j]==0) { if(dis[j]>dis[pos]+map[pos][j]) { dis[j]=dis[pos]+map[pos][j]; money[j]=money[pos]+price[pos][j]; } else if(dis[j]==dis[pos]+map[pos][j]&&money[j]>money[pos]+price[pos][j]) { money[j]=money[pos]+price[pos][j];} } } }}int main(){ int a,b,c,d; while(scanf("%d%d",&n,&m)&&n&&m) { for(i=0;i<=n;i++) for(j=0;j<=n;j++) { map[i][j]=Max; price[i][j]=Max;} for(int i=1;i<=m;i++) { scanf("%d%d%d%d",&a,&b,&c,&d); if(map[a][b]>c) { map[a][b]=map[b][a]=c; price[a][b]=price[b][a]=d; } else if(c==map[a][b]&&d<price[a][b]) { price[a][b]=price[b][a]=d;} } scanf("%d%d",&s,&t); dijkstral(); printf("%d %d\n",dis[t],money[t]); } return 0;}
阅读全文
0 0
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- A
- A*
- a
- A
- a
- 加载动态效果(三点变化)-3
- 建站记录3——边距自适应布局Tip总结
- 实现浏览器兼容版的element.children
- Eclipse Maven 编译错误 Dynamic Web Module 3.0 requires Java 1.6 or newer 解决方案 (特别注意))
- Docker中监控Java应用程序的方法!
- A
- leetcode--1.two sum
- Git && SVN
- opencv 利用仿射变换函数对图像进行任意角度旋转
- 加载动态效果(8点圆形转)-4
- 进入子shell的各种情况分析
- java面试题之初
- 二进制除法转乘法原理
- Java值传递和引用传递基础分析