最短路径问题

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
5 7
1 2 5 5 
2 3 4 5
1 3 4 6
3 4 2 2
3 5 4 7
4 5 2 4
1 3 4 4
1 5
 
0 0
 
Sample Output
9 11
8 10
 #include<iostream>
#include<cstring>
using namespace std;
const int oo=;
int **weight,**profit;//权值和花费
int s,e;
int n,m;
int *low,*vis,*lowp,*pre;
int**Apply_space(int n)
{
int **p;
p=new int*[n+];
for(int i=;i<=n;i++)
p[i]=new int[n+];
return p;
}
void dijkstra()
{
for(int i=;i<=n;i++)
{
low[i]=weight[s][i];
lowp[i]=profit[s][i];
pre[i]=s;//初始化路径
}
low[s]=lowp[s]=;
vis[s]=;
pre[s]=;
for(int i=;i<n;i++)
{
int v;
int Min=oo;
for(int j=;j<=n;j++)
if(!vis[j]&&low[j]<Min)
{
Min=low[j];
v=j;
}
vis[v]=;
for(int j=;j<=n;j++)
{
if(!vis[j]&&low[j]>low[v]+weight[v][j])
{
low[j]=low[v]+weight[v][j];
lowp[j]=lowp[v]+profit[v][j];
pre[j]=v;//标记路径
}
else if(!vis[j]&&low[j]==low[v]+weight[v][j])
{
if(lowp[j]>=lowp[v]+profit[v][j])
{
lowp[j]=lowp[v]+profit[v][j];
pre[j]=v;//标记路径
}
}
}
}
}
void dfs(int i)//输出路径
{
if(pre[i]==)
{
cout<<i<<" ";
return;
}
int j=pre[i];
dfs(j);
cout<<i<<" ";
}
int main()
{
while(scanf("%d %d",&n,&m)==&&(n||m))
{
profit=Apply_space(n);
weight=Apply_space(n);
low=new int[n+];
vis=new int[n+];
lowp=new int[n+];
pre=new int[n+];
for(int i=;i<=n;i++)
{
vis[i]=;
} for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
profit[i][j]=(i==j)?:oo;
weight[i][j]=(i==j)?:oo;
}
int a,b,c,d;
for(int i=;i<=m;i++)
{
scanf("%d %d %d %d",&a,&b,&c,&d);
if(weight[a][b]>c)
{
weight[a][b]=weight[b][a]=c;
profit[a][b]=profit[b][a]=d;
}
else if(weight[a][b]==c)
{
if(profit[a][b]>d)
{
profit[a][b]=profit[b][a]=d;
}
}
}
scanf("%d %d",&s,&e);
dijkstra();
printf("%d %d\n",low[e],lowp[e]);
//dfs(e);//记录路径使用
delete []profit;delete []weight;delete []low;delete []vis;
delete []pre;
}
return ;
}

最新文章

  1. [LeetCode] Best Time to Buy and Sell Stock IV 买卖股票的最佳时间之四
  2. 关于Vue vuex vux 文档
  3. htaccess文件还可以被用来把访问网站的流量劫持到黑客的网站
  4. CSS3 -webkit-transform
  5. Oracle中INSTR、SUBSTR和NVL的用法
  6. Java Security: Illegal key size or default parameters?
  7. iOS- UITextField限制输入长度
  8. 【基础知识】.Net基础加强06天
  9. python Django 学习笔记(五)—— Django admin自动管理界面
  10. backbone.Model 源码笔记
  11. 前端H5开发工具 Adobe Edge
  12. C和指针c6-1
  13. 桦仔 笔记4-徐 模仿灾难发生时还原adventurework数据库 示例 stopat
  14. Iterator invalidation(迭代器失效)
  15. C/C++程序在main之前执行代码
  16. DotnetSpider (二) Downloader的设置 Request自定义数据字典
  17. TypeScript 中的方法重载
  18. Spark记录-Scala基础程序实例
  19. Mysql for Linux安装配置之—— 源码安装
  20. 给电脑换源 npm 国内镜像 cnpm

热门文章

  1. Office 365 E3功能
  2. Ubuntu 常用软件推荐(QQ、微信、MATLAB等)及安装过程
  3. HADOOP docker(五):hadoop用户代理 Proxy user
  4. Python高级编程-多进程
  5. 新人学PHP,认为手动搭建环境而苦恼吗?这篇文章告诉你多简单!
  6. P4语法(1)基础数据类型和Header
  7. java实现几种简单的排序算法
  8. mysql入门 — (1)
  9. Vue自定义事件,$on(eventName) 监听事件,$emit(eventName) 触发事件
  10. ConcurrentHashMap弱一致性