ACM3790迪杰斯特拉算法运用
2024-08-25 15:06:40
最短路径问题
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)
(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 ;
}
最新文章
- [LeetCode] Best Time to Buy and Sell Stock IV 买卖股票的最佳时间之四
- 关于Vue vuex vux 文档
- htaccess文件还可以被用来把访问网站的流量劫持到黑客的网站
- CSS3 -webkit-transform
- Oracle中INSTR、SUBSTR和NVL的用法
- Java Security: Illegal key size or default parameters?
- iOS- UITextField限制输入长度
- 【基础知识】.Net基础加强06天
- python Django 学习笔记(五)—— Django admin自动管理界面
- backbone.Model 源码笔记
- 前端H5开发工具 Adobe Edge
- C和指针c6-1
- 桦仔 笔记4-徐 模仿灾难发生时还原adventurework数据库 示例 stopat
- Iterator invalidation(迭代器失效)
- C/C++程序在main之前执行代码
- DotnetSpider (二) Downloader的设置 Request自定义数据字典
- TypeScript 中的方法重载
- Spark记录-Scala基础程序实例
- Mysql for Linux安装配置之—— 源码安装
- 给电脑换源 npm 国内镜像 cnpm
热门文章
- Office 365 E3功能
- Ubuntu 常用软件推荐(QQ、微信、MATLAB等)及安装过程
- HADOOP docker(五):hadoop用户代理 Proxy user
- Python高级编程-多进程
- 新人学PHP,认为手动搭建环境而苦恼吗?这篇文章告诉你多简单!
- P4语法(1)基础数据类型和Header
- java实现几种简单的排序算法
- mysql入门 — (1)
- Vue自定义事件,$on(eventName) 监听事件,$emit(eventName) 触发事件
- ConcurrentHashMap弱一致性