时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

A traveler's map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a program to help a traveler to decide the shortest path between his/her starting city and the destination. If such a shortest path is not unique, you are supposed to output the one with the minimum cost, which is guaranteed to be unique.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 4 positive integers N, M, S, and D, where N (<=500) is the number of cities (and hence the cities are numbered from 0 to N-1); M is the number of highways; S and D are the starting and the destination cities, respectively. Then M lines follow, each provides the information of a highway, in the format:

City1 City2 Distance Cost

where the numbers are all integers no more than 500, and are separated by a space.

Output Specification:

For each test case, print in one line the cities along the shortest path from the starting point to the destination, followed by the total distance and the total cost of the path. The numbers must be separated by a space and there must be no extra space at the end of output.

Sample Input

4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20

Sample Output

0 2 3 3 40
 #include<stdio.h>
#define MAX 510
int INF = ;
struct Edg
{
int len;
int cost;
}; int d[MAX];
int c[MAX];
Edg Grap[MAX][MAX];
bool vist[MAX];
int pre[MAX]; void Dijkstra(int begin,int NodeNum)
{
d[begin] = ;
c[begin] = ;
for(int i = ;i <NodeNum ;i++)
{
int index =-;
int MIN = INF;
for(int j = ;j < NodeNum ;j++)
{
if(!vist[j] && MIN > d[j])
{
MIN = d[j];
index = j;
}
} if(index == -) return; vist[index] = true; for(int v = ;v < NodeNum ; v++)
{
if(!vist[v] && Grap[index][v].len != INF)
{
if(d[index]+ Grap[index][v].len < d[v])
{
d[v] = d[index]+ Grap[index][v].len;
c[v] = c[index] + Grap[index][v].cost;
pre[v] = index;
}
else if(d[index]+ Grap[index][v].len == d[v] && c[v] > c[index] + Grap[index][v].cost)
{
c[v] = c[index] + Grap[index][v].cost;
pre[v] = index;
}
}
}
} } void DFS(int begin,int end)
{
if(end == begin)
{
printf("%d ",end);
return ;
}
DFS(begin,pre[end]);
printf("%d ",end);
} int main()
{
int i,j,N,M,S,D,x,y;
Edg Etem;
scanf("%d%d%d%d",&N,&M,&S,&D); for(i =;i < N;i++)
{
for(j =;j < N;j++)
{
Grap[i][j].cost = INF;
Grap[i][j].len = INF;
}
} for(i =;i < M;i++)
{
scanf("%d%d%d%d",&x,&y,&Etem.len,&Etem.cost);
Grap[x][y] = Grap[y][x] = Etem;
d[i] = c[i] = INF;
} Dijkstra(S,N); DFS(S,D); printf("%d %d\n",d[D],c[D]);
return ;
}

最新文章

  1. 使用PublishSetting快速在Powershell中登录Azure
  2. HDU 1003 动态规划
  3. 最大的LeftMax与rightMax之差绝对值
  4. oracle创建表空间,创建用户(转)
  5. php把时间格式化
  6. 【Matlab】随机游走产生图像效果
  7. Android 编程下 java.lang.NoClassDefFoundError: cn.jpush.android.api.JPushInterface 报错
  8. oracle命令行操作
  9. Android下如何理解onMeasure,onLayout的过程
  10. C# WPF 建立无边框(标题栏)的登录窗口
  11. php安装扩展模块(curl模块)
  12. JAVA - 优雅的记录日志(log4j实战篇) (转)
  13. Windows Phone 8 - Runtime Location API - 2
  14. 使用hashCode()和equals()方法 - Java
  15. Xamarin介绍
  16. JAVA高级篇(一、JVM基本概念)
  17. Spring Cloud(Dalston.SR5)--Hystrix 监控
  18. 05-RARP: 逆地址解析协议
  19. 获取windows鼠标的当前坐标
  20. Linux 的伪终端的基本原理 及其在远程登录(SSH,telnet等)中的应用

热门文章

  1. Debian 7 安装 Emacs 24.3
  2. Xcode 只有iOS device一个选项的解决办法
  3. Core Bluetooth Programming Guide
  4. 自定义实现简单的Android颜色选择器(附带源码)
  5. Javascript之获取屏幕宽高
  6. SQL_insert into(把B表某些字段,插入A表某些字段)
  7. jQuery API 3.1.0 速查表-打印版
  8. phpwind wap功能添加百度wap统计
  9. 229. Majority Element II My Submissions Question
  10. SQL之存储过程,仿数组