最短路径(Dijkstra)
发布时间:2020-12-15 08:01:59 所属栏目:Java 来源:网络整理
导读:最短路径问题 Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 43967????Accepted Submission(s): 12599 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,
最短路径问题Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
?
?
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000,0<m<100000,s != t)
?
?
Output
输出 一行有两个数, 最短距离及其花费。
?
?
Sample Input
3 2 1 2 5 6 2 3 4 5 1 3 0 0
?
?
Sample Output
9 11
?
?
Source
浙大计算机研究生复试上机考试-2010年
?这道题用floyd算法会超时
两个权值的Dijkstra。。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <algorithm> #include <iostream> #include<cstdio> #include<string> #include<cstring> #include <stdio.h> #include <queue> #include <string.h> #include <vector> #include <map> #define ME(x,y) memset(x,y,sizeof(x)) #define SF(n) scanf("%d",&n) #define rep(i,n) for(int i = 0 ; i < n ; i ++) #define INF 0x3f3f3f3f #define mod 1024 using namespace std; typedef long long ll ; int n,m ; int b,e ; int ma[1009][1009]; int dis[1009]; int val[1009][1009]; int val1[1009]; int vis[1009]; void Dijia(int r) { for(int i = 1 ; i <= n ; i++) { dis[i] = ma[r][i]; val1[i] = val[r][i]; } vis[r] = 1 ; for(int i = 1 ; i < n ; i++) { int min1 = INF; int min2 = INF; int pos ; for(int j = 1 ; j <= n ; j++) { if(!vis[j]) { if(min1 > dis[j]) { min1 = dis[j]; min2 = val1[j]; pos = j ; } else if(min1 == dis[j]) { min2 = min(min2,val1[j]); pos = j ; } } } vis[pos] = 1 ; for(int j = 1 ; j <= n ; j++) { if(dis[j] > dis[pos] + ma[pos][j]) { dis[j] = dis[pos] + ma[pos][j]; val1[j] = val1[pos] + val[pos][j]; } else if(dis[j] == dis[pos] + ma[pos][j]) { val1[j] = min(val1[j],val1[pos] + val[pos][j]); } } } } int main() { while(~scanf("%d%d",&n,&m) && (n || m)) { memset(ma,INF,sizeof(ma)); memset(val,sizeof(val)); memset(vis,0,sizeof(vis)); for(int i = 1 ; i <= m ; i++) { int f,t,w,v ; scanf("%d%d%d%d",&f,&t,&w,&v); if(ma[f][t] > w)//这里要注意可能出现同一条路线,但距离和价值都不同,需要对应起来 { ma[f][t] = ma[t][f] = w; val[f][t] = val[t][f] = v; } else if(ma[f][t] == w) { val[f][t] = val[t][f] = min(val[f][t],v); } } scanf("%d%d",&b,&e); Dijia(b); printf("%d %dn",dis[e],val1[e]); } return 0 ; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |