【Aizu - 2249】Road Construction(最短路 Dijkstra算法)
Road Construction
Descriptions
Mercer国王是ACM王国的王者。他的王国里有一个首都和一些城市。令人惊讶的是,现在王国没有道路。最近,他计划在首都和城市之间修建道路,但事实证明他的计划的建设成本远高于预期。
为了降低成本,他决定通过从原计划中删除一些道路来制定新的施工计划。但是,他认为新计划应满足以下条件:
- 对于每对城市,都有一条连接它们的路线(一组道路)。
- 首都和每个城市之间的最小距离不会改变他原来的计划。
许多计划可能符合上述条件,但King Mercer希望以最低成本了解该计划。您的任务是编写一个程序,该程序读取其原始计划并以最低成本计算新计划的成本。
输入
输入包含多个数据集。每个数据集的格式如下。
N M
u1 v1 d1 c1
.
.
.
uM vM dM cM
每个数据集的第一行开始于两个整数,Ñ和中号(1≤ Ñ ≤10000,0≤ 中号 ≤20000)。N和M分别表示原始计划中的城市数量和道路数量。
以下M行描述了原始计划中的道路信息。在我个行包含四个整数 ui,v i,d i和ci(1≤ ui,vi ≤ N,ui ≠ v i,1≤ di ≤1000,1≤ ci ≤1000 )。ui,v i,d i和ci表明有是连接道路ui个城市和v i个城市,其长度为d i和它的成本需要建设ci。
每条道路都是双向的。没有两条道路连接同一对城市。第一城市是王国的首都。
输入的结尾由包含两个由空格分隔的零的线表示。您不应将该行作为数据集处理。
输出
对于每个数据集,打印满足一行条件的计划的最低成本。
样本输入
3 3
1 2 1 2
2 3 2 1
3 1 3 2
5 5
1 2 2 2
2 3 1 1
1 4 1 1
4 5 1 1
5 3 1 1
5 10
1 2 32 10
1 3 43 43
1 4 12 52
1 5 84 23
2 3 58 42
2 4 86 99
2 5 57 83
3 4 11 32
3 5 75 21
4 5 23 43
5 10
1 2 1 53
1 3 1 65
1 4 1 24
1 5 1 76
2 3 1 19
2 4 1 46
2 5 1 25
3 4 1 13
3 5 1 65
4 5 1 34
0 0
样本输入的输出
3
5
137
218
题目链接
https://vjudge.net/problem/Aizu-2249
求出城市1到各个城市之间的最短距离,同时算出城市1到各个城市之间的最低花费
10003Floyd显然会超时,而且这里没负数,Dijkstra算法再好不过了,下面我写的Dijkstra算法改了一下,用的二维数组d[i][j],可以求出i到j的最短距离,虽然在这没什么用,但是用以后肯定用的到,这个可以直接拿来用,这个模板可以copy一下
AC代码
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0)
#define Mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 20000+5
#define P pair<int,int>//first最短路径second顶点编号
using namespace std;
int N,M;
struct edge
{
int to,dis,cost;
edge(int to,int dis,int cost):to(to),dis(dis),cost(cost) {}
};
vector<edge>G[Maxn];//G[i] 从i到G[i].to的距离为dis,花费的钱为cost
int d[Maxn][Maxn];//d[i][j]从i到j的最短距离
int sum[Maxn];//sum[i],起点到i之间所需要的花费的钱
void Dijk(int s)
{
priority_queue<P,vector<P>,greater<P> >q;//按first从小到大出队
for(int i=; i<=N; i++)
d[s][i]=INF;
d[s][s]=;
q.push(P(,s));
while(!q.empty())
{
P p=q.top();
q.pop();
int v=p.second;//点v
if(d[s][v]<p.first)
continue;
for(int i=; i<G[v].size(); i++)
{
edge e=G[v][i];//枚举与v相邻的点
if(d[s][e.to]>=d[s][v]+e.dis)
{
if(d[s][e.to]==d[s][v]+e.dis)//距离相等,比较谁花费的钱少
sum[e.to]=min(sum[e.to],e.cost);
else//若d[s][e.to]>d[s][v]+e.dis,相求出最短距离,再求出最短距离所需要的钱
sum[e.to]=e.cost;
d[s][e.to]=d[s][v]+e.dis;
q.push(P(d[s][e.to],e.to));
}
}
}
}
int main()
{
IOS;
while(cin>>N>>M,N+M)
{
MEM(sum,);
for(int i=; i<=N; i++)
G[i].clear();
for(int i=; i<M; i++)
{
int u,v,d,c;
cin>>u>>v>>d>>c;
G[u].push_back(edge(v,d,c));
G[v].push_back(edge(u,d,c));
}
Dijk();//城市1到各个城市的最短距离
int ans=;
for(int i=; i<=N; i++)
ans+=sum[i];
cout<<ans<<endl;
}
return ;
}
【Aizu - 2249】Road Construction(最短路 Dijkstra算法)的更多相关文章
- Aizu - 2249 Road Construction
题目:给出若干个建筑之间的一些路,每条路都有对应的长度和需要的花费,问在保证源点1到其他个点的距离最短的情况下,最少的花费是多少/ 思路:和一般的最短路问题相比,多了一个 数组id[i],用来记录到达 ...
- 单源最短路dijkstra算法&&优化史
一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...
- 最短路Dijkstra算法的一些扩展问题
最短路Dijkstra算法的一些扩展问题 很早以前写过关于A*求k短路的文章,那时候还不明白为什么还可以把所有点重复的放入堆中,只知道那样求出来的就是对的.知其然不知其所以然是件容易引发伤痛的 ...
- ACM: HDU 2544 最短路-Dijkstra算法
HDU 2544最短路 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descrip ...
- 单源最短路Dijkstra算法——matlab实现
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...
- hdu2544 最短路 Dijkstra算法
最短路(Dijkstra算法模板题) Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 单源最短路(Dijkstra算法)
#返回上一级 @Author: 张海拔 @Update: 2015-03-11 @Link: http://www.cnblogs.com/zhanghaiba/p/3514570.html Dijk ...
- 单源最短路——dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问 ...
- POJ 3268 Silver Cow Party 最短路—dijkstra算法的优化。
POJ 3268 Silver Cow Party Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbe ...
随机推荐
- 零基础ASP.NET Core MVC插件式开发
零基础ASP.NET Core MVC插件式开发 一个项目随着业务模块的不断增加,系统会越来越庞大.如果参与开发的人员越多,管理起来也难度也很大.面对这样的情况,首先想到的是模块化插件式开发,根据业务 ...
- tomcat问题解决
tomcat问题解决 运行tomcat环境下,idea中出现 error running 项目名address localhost1099 is already in use 的时候,如何解决? 1, ...
- java算法题每日一练01,java入门简单算法题小练
1.给数组做反序 public class Ak01 { public static void main(String[] args) { int[] a = new int[]{22,48,41,2 ...
- 【EdgeBoard体验】开箱与上手
简介 市面上基于嵌入式平台的神经网络加速平台有很多,今天给大家带来是百度大脑出品的EdgeBoard.按照官网文档的介绍,EdgeBoard是基于Xilinx Zynq Ultrascale+ MPS ...
- Sublime Text 3 实现C++代码的编译和运行
在数据结构代码的编写中,我选用了优秀的编辑器 Sublime Text 3,但是在实现C++代码的编译和运行上费了一番周折,接下来我贴出 C++ 编译系统的代码,供各位参考. 编译后是在弹出的CMD命 ...
- SpringBoot入门(一):从HelloWorld开始
从0开始创建springBoot项目,话不多说,跟着我一步一步来就行了. 1.新建项目 1) 创建新项目,选择project, 点点点就好了 2) Spring Initializr——>选择 ...
- 实现一个Golang的reverse函数
Reverse函数,用来反转列表,本例子用golang实现,反转一个slice列表. 因为slice是引用类型,因此直接修改参数的值即可. func myReverse(l []string) { f ...
- python模块知识一 自定义模块、time、datetime时间模块
第五章 模块 1.自定义模块: 模块分类: 内置模块(标准库)-- python解释器自带的.py文件(模块) 第三方模块(各种大神写的)-- 需要额外下载(并发编程pypi) 自定义模块(自己写的) ...
- 重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印
重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印 一.引言 桌面端系统经常需要对接各种硬件设备,比如扫描器.读卡器.打印机等. 这里介绍下桌面端 ...
- Initialization failed for 'https://start.spring.io' Please check URL
错误描述:Initialization failed for 'https://start.spring.io' Please check URL, network and proxy setting ...