最短路径问题 HDU 3790
最短路径问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20846 Accepted Submission(s): 6191
(1<n<=1000, 0<m<100000, s != t)
1 2 5 6
2 3 4 5
1 3
0 0
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
struct edge{
int to,dis,cost;
};
vector<edge> g[];
typedef pair<int,int> pa; //第一元素是距离,第二元素是编号
int d[],p[];
int s,t;
void dijkstra(){
memset(d,INF,sizeof(d));
memset(p,INF,sizeof(p));
d[s] = ;
p[s] = ;
priority_queue< pa, vector<pa>, greater<pa> > q;
q.push(pa(,s));
while(!q.empty()){
pa cur = q.top(); q.pop();
int v = cur.second;
if(d[v]<cur.first) continue;
for(int i = ; i<g[v].size(); i++){
edge e = g[v][i];
if(d[e.to] >= d[v]+e.dis){
d[e.to] = d[v]+e.dis;
p[e.to] = p[v]+e.cost;
q.push(pa(d[e.to],e.to));
}
}
}
}
void solve(){
int n,m;
while(scanf("%d%d",&n,&m) == && n && m){
for(int i = ; i<m; i++){
int a,b,c,p;
scanf("%d%d%d%d",&a,&b,&c,&p);
g[a].push_back((edge){b,c,p});
g[b].push_back((edge){a,c,p});
}
scanf("%d%d",&s,&t);
dijkstra();
printf("%d %d\n",d[t],p[t]);
for(int i = ; i<; i++) g[i].clear();
}
}
int main(){
solve();
}
第两种写法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
struct edge{
int to,dis,cost;
friend bool operator < (edge A,edge B){
if(A.dis!=B.dis) return A.dis>B.dis;
else return A.cost>B.cost;
}
};
vector<edge> g[];
//typedef pair<int,int> pa; //第一元素是距离,第二元素是编号
int d[],p[];
bool done[];
int s,t;
void dijkstra(){
memset(d,INF,sizeof(d));
memset(p,INF,sizeof(p));
memset(done,false,sizeof(done));
d[s] = ;
p[s] = ;
priority_queue<edge> q;
q.push((edge){s,,});
while(!q.empty()){
edge cur = q.top(); q.pop();
int v = cur.to;
if(done[v]) continue;
done[v] = true;
for(int i = ; i<g[v].size(); i++){
edge e = g[v][i];
if((d[e.to] > d[v]+e.dis)||(d[e.to] == d[v]+e.dis&&p[e.to]>p[v]+e.cost)){
d[e.to] = d[v]+e.dis;
p[e.to] = p[v]+e.cost;
q.push((edge){e.to,d[e.to],p[e.to]});
}
}
}
}
void solve(){
int n,m;
while(scanf("%d%d",&n,&m) == && n && m){
for(int i = ; i<m; i++){
int a,b,c,p;
scanf("%d%d%d%d",&a,&b,&c,&p);
g[a].push_back((edge){b,c,p});
g[b].push_back((edge){a,c,p});
}
scanf("%d%d",&s,&t);
dijkstra();
printf("%d %d\n",d[t],p[t]);
for(int i = ; i<; i++) g[i].clear();
}
}
int main(){
solve();
}
最短路径问题 HDU 3790的更多相关文章
- 最短路径问题 HDU - 3790 (Dijkstra算法 + 双重权值)
参考:https://www.cnblogs.com/qiufeihai/archive/2012/03/15/2398455.html 最短路径问题 Time Limit: 2000/1000 MS ...
- ACM: HDU 3790 最短路径问题-Dijkstra算法
HDU 3790 最短路径问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
- HDU - 3790 最短路径问题 (dijkstra算法)
HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...
- HDU 3790最短路径问题 [最短路最小花费]
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3790] 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 3790 最短路径问题(双重权值,dijkstra算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...
- hdu 3790 最短路径问题(两个限制条件的最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,仅仅是在推断条件时 ...
- HDU 3790 最短路径问题 (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 简单的最短路问题,这题听说有重边.我用spfa和dijkstra写了一遍,没判重边,速度都差不多 ...
- hdu 3790 (最短路径问题dijkstra)
主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...
- #HDU 3790 最短路径问题 【Dijkstra入门题】
题目: 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
随机推荐
- 获取输入设备的vid和pid
一.获取/dev/input/event16设备的vid和pid testhid.c #include <linux/types.h> #include <linux/input.h ...
- NSTimer定时器
NSTimer的避免内存泄露与控制器的正确引用和释放:
- C#生成随机汉字
using System; using System.Text; namespace ConsoleApplication { class ChineseCode { ...
- javascript IP验证
//IP验证function isIP(strIP){try{if(strIP.length<7){return false;}var re=/^(\d+)\.(\d+)\.(\d+)\.(\d ...
- (转)Tomcat内存设置详解
Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出JVM在启 ...
- 01_change_schema.sql
set echo on feedback on spool ./log/01_change_schema.log -- -- schema change to v_idocdata_un -- -- ...
- hibernate缓存机制(二级缓存)
一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数 ...
- C++矩阵处理库--Eigen初步使用
项目要进行比较多的矩阵操作,特别是二维矩阵.刚开始做实验时,使用了动态二维数组,于是写了一堆Matrix函数,作矩阵的乘除加减求逆求行列式.实验做完了,开始做代码优化,发现Matrix.h文件里适 ...
- F(k)<(维护+枚举)\(找规律+递推+枚举)>
题意 小明有一个不降序列(f(1),f(2),f(3),--),f(k)代表在这个序列中大小是k的有f(k)个.我们规定f(n)的前12项如下图. n 1 2 3 4 5 6 7 8 9 10 11 ...
- Git本地项目上传 & SourceTree & GitHub 简单使用
Git(分布式版本控制系统) Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理 ...