码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 3790 最短路径问题(迪杰斯特拉)

时间:2016-04-09 10:32:35      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20555    Accepted Submission(s): 6098


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
 

 

Recommend
notonlysuccess   |   We have carefully selected several similar problems for you:  1142 2680 1385 1598 1596 
 
同样是最短路的模板题,不过加入了花费这个元素,当路程相同时,选择花费小的方案,还是比较好处理的。
 
题意:中文题,很好理解。
 
附上代码:
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #define M 1005
 5 #define MAX 0x3f3f3f3f
 6 using namespace std;
 7 int map[M][M],vis[M],dis[M],money[M][M],r[M];
 8 int main()
 9 {
10     int n,m,i,j,s,t;
11     while(~scanf("%d%d",&n,&m))
12     {
13         if(!n&&!m) break;
14         memset(vis,0,sizeof(vis));
15         memset(dis,0,sizeof(dis));
16         memset(r,0,sizeof(r));
17         for(i=1; i<=n; i++)
18             for(j=1; j<=n; j++)
19             {
20                 if(i==j) map[i][j]=0,money[i][j]=0;
21                 else     map[i][j]=MAX,money[i][j]=MAX;
22             }
23         int a,b,c,d;
24         while(m--)
25         {
26             scanf("%d%d%d%d",&a,&b,&c,&d);
27             if(map[a][b]>c)
28             {
29                 map[a][b]=c,map[b][a]=c;
30                 money[a][b]=d,money[b][a]=d;
31             }
32         }
33         scanf("%d%d",&s,&t);
34         vis[s]=1;
35         for(i=1; i<=n; i++)
36         {
37             dis[i]=map[s][i];
38             r[i]=money[s][i];
39         }
40         int w,min;
41         for(i=1; i<=n; i++)
42         {
43             min=MAX;
44             for(j=1; j<=n; j++)
45                 if(!vis[j]&&min>dis[j])
46                 {
47                     min=dis[j];
48                     w=j;
49                 }
50             vis[w]=1;
51             for(j=1; j<=n; j++)
52             {
53                 if(!vis[j]&&map[w][j]<MAX)
54                 {
55                     if(dis[j]>dis[w]+map[w][j])
56                     {
57                         dis[j]=dis[w]+map[w][j];
58                         r[j]=r[w]+money[w][j];
59                     }
60                     else if(dis[j]==dis[w]+map[w][j] && r[j]>r[w]+money[w][j])  //路程相同时,花费的处理
61                         r[j]=r[w]+money[w][j];
62                 }
63             }
64         }
65         printf("%d %d\n",dis[t],r[t]);
66     }
67     return 0;
68 }

 

hdu 3790 最短路径问题(迪杰斯特拉)

标签:

原文地址:http://www.cnblogs.com/pshw/p/5370880.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!