【杭电】[3790]最短路径问题
2016-03-12 10:55
465 查看
双权最短路
需要同时考虑两个权值
这里是优先长度,长度相同的情况下优先花费较少的边
有点麻烦的是
之前用的写法的逻辑似乎出了点问题
在更新边长时的判断不够严谨
好在最后发现了
还有这种类型的题
一般都需要考虑重边问题
用的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]最短路径问题
相关文章推荐
- 高精度加法——杭电1002
- Hdu2066(一个人的旅行)
- 杭电1870 愚人节的礼物
- Poj2638 网络流+最短路+二分答案
- Aizu1311 分层图最短路 (...大概)
- 关于杭电1405 The Last Practice 的问题
- hdu-1103 模拟题。
- hdu-1022 栈的应用。
- hdu-1247 简单map的应用。(字典树)
- hdu-1251 字典树公共前缀。
- hdu-1075 map映射表的应用。
- 最短路径 -- spfa
- hdu 1005 -- Number Sequence
- hdu 1007 -- Quoit Design
- 杭电1004
- 杭电1005
- 杭电1008
- c++编写藏手帕问题
- 单源最短路深度分析
- 杭电1434 优先队列