【杭电】[3790]最短路径问题
来源:互联网 发布:淘宝 真皮皮带 编辑:程序博客网 时间:2024/06/06 08:56
双权最短路
需要同时考虑两个权值
这里是优先长度,长度相同的情况下优先花费较少的边
有点麻烦的是
之前用的写法的逻辑似乎出了点问题
在更新边长时的判断不够严谨
好在最后发现了
还有这种类型的题
一般都需要考虑重边问题
用的Dijkstra
#include<stdio.h>int e[1200][1200],q[1200][1200],dis[1200],qs[1200];int main() { int inf=99999999; int n,m; while(scanf("%d %d",&n,&m),n||m) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(i==j) e[i][j]=0; else q[i][j]=e[i][j]=inf; } } while(m--) { int x,y,t1,t2; scanf("%d %d %d %d",&x,&y,&t1,&t2); if(e[x][y]>t1||(e[x][y]==t1&&q[x][y]>t2)) { e[x][y]=e[y][x]=t1; q[x][y]=q[y][x]=t2; } } int s,t; scanf("%d %d",&s,&t); for(int i=1; i<=n; i++) { qs[i]=q[s][i]; dis[i]=e[s][i]; } bool flag[1200]; for(int i=1; i<=n; i++) flag[i]=false; flag[s]=true; for(int i=1; i<=n; i++) { int min=inf,mmin=inf,tj; for(int j=1; j<=n; j++) { if(!flag[j]&&(dis[j]<min||(dis[j]==min&&qs[j]<mmin))) { min=dis[j]; mmin=qs[j]; tj=j; } } flag[tj]=true; for(int k=1; k<=n; k++) { if(!flag[k]&&(dis[k]>dis[tj]+e[tj][k]||(dis[k]==dis[tj]+e[tj][k]&&qs[k]>qs[tj]+q[tj][k]))) { qs[k]=qs[tj]+q[tj][k]; dis[k]=dis[tj]+e[tj][k]; } } } printf("%d %d\n",dis[t],qs[t]); } return 0;}
再放一个Floyd的吧
不过这个超时了
#include <stdio.h>int e[1200][1200];int q[1200][1200];int main() { int inf=9999999; int n,m; while(scanf("%d %d",&n,&m),n||m) { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(i==j) e[i][j]=0; else { q[i][j]=e[i][j]=inf; } while(m--) { int x,y,t1,t2; scanf("%d %d %d %d",&x,&y,&t1,&t2); if(t1<e[x][y]||(t1==e[x][y]&&q[x][y]>t2)) { e[x][y]=t1; q[x][y]=t2; } } for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(e[i][j]>e[i][k]+e[k][j]||(e[i][j]==e[i][k]+e[k][j]&&q[i][j]>q[i][k]+q[k][j])) { e[i][j]=e[i][k]+e[k][j]; q[i][j]=q[i][k]+q[k][j]; } int s,t; scanf("%d %d",&s,&t); printf("%d %d\n",e[s][t],q[s][t]); } return 0;}
题目地址:【杭电】[3790]最短路径问题
0 0
- 杭电 3790 最短路径问题
- 杭电3790最短路径问题
- 【杭电】[3790]最短路径问题
- 杭电3790最短路径问题
- 杭电_3790_最短路径问题
- 杭电1874最短路径问题
- 杭电 hdu 3790 最短路径问题 (最短路径 + Dijkstra)稍微的变形
- 杭电hdu 3790 最短路径问题 dijkstra
- 杭电ACM HDU 3790 最短路径问题
- HDU--杭电--3790--最短路径问题
- 最短路径问题(杭电3790)(Dijkstra)
- 最短路径问题 HDU杭电3790 【Dijkstra算法】
- 杭电3790 最短路径问题(djstra过)
- 【杭电oj】3790 - 最短路径问题(dijkstra)
- 杭电Problem-3790 最短路径问题
- 杭电3790 最短路径问题(djstra过)
- 【杭电OJ】3790--最短路径(dijkstra)
- 杭电ACM1874(最短路径)
- Python缓存机制介绍
- Shadow mapping
- 面向对象与面向过程的区别
- 单链表创建
- 多线程(三)
- 【杭电】[3790]最短路径问题
- Android 中Webview 自适应屏幕
- SVM算法教科书(一)
- android的消息处理机制
- 为什么你应该(从现在开始就)写博客
- 【概念】协议理解之HTTPS
- docker启动Mysql
- 判断移动端PC端访问网页时跳转到对应的移动端网页
- IEEE的latex模板的单双栏设置方法