最短路径问题 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 ...
随机推荐
- hdu_Anniversary party_(树形DP入门题)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...
- Android实现Excel表格,且表格能左右、上下滑动
1.自定义实现一个水平滚动控件HorizontalScrollView import android.content.Context; import android.util.AttributeSet ...
- if语句,函数function
1.语句 一般分为顺序,分支和循环语句. if是分支语句 格式1:if(){} 若满足就进入花括号,若不满足就跳过 格式2:if(){}else(){}二选一.若if满足则else一定不执行,反之则 ...
- C#在Json反序列化中处理键的特殊字符
假设有如下Json 数据: 1.{ 2."id" : 1, 3."@value" : "this a @", 4."$p" ...
- Ubuntu 14.04 Nvidia显卡驱动手动安装及设置
更换主板修复grub 引导后,无法从Nvidia进入系统(光标闪烁), 可能是显卡驱动出了问题. 1. 进入BIOS设置, 从集成显卡进入系统 将显示器连接到集显的VGI口, 并在BIOS中设置用 ...
- 去掉input text后面的叉
如题 input[type=text]::-ms-clear{ display: none; } input::-webkit-search-cancel-button{ display: none; ...
- 非root启动80端口
Linux非root用户如何使用80端口启动程序 默认情况下Linux的1024以下端口是只有root用户才有权限占用,我们的tomcat,apache,nginx等等程序如果想要用普通用户来占用 ...
- c++中string的用法
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至 ...
- POJ 1067 取石子游戏 威佐夫博弈
威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 我们用(ak,bk)(ak ≤ bk ,k= ...
- div.2/Bellovin<最长上升子序列>
题意: 序列arr[i--n];输出以a[i]为结尾的最长上升子序列.1<=n<=100000; 思路: O(n*log(n)),求最长上升子序列. #include<cstdio& ...