CSU——2161: 漫漫上学路 最短路
Description
众所周知,CSU(California State)University) 的上课地点距离学生公寓很远,对于爱睡懒觉的小Z来说,每天去上课就成了一件非常头疼的事,如果有早课的话更是如此。为了能让自己多睡一会,同时不至于上课迟到,小Z决定规划一条去新校的路线。
去新校的路上有很多条双向道路,每条道路连接了两个路口,且直接连接两个路口的道路只有一条,不存在一条道路的两端为同一个路口,每条道路都有一定的距离。同时道路两侧商铺众多,在提供了美食的同时也造成了一定程度的拥堵,在小Z心中每条道路都有一个拥堵值和美味值,且定义某条从学生公寓路口到新校路口的路线的拥堵值为其经过的道路的拥堵值之和,美味值为其经过道路的美味值之和。
因为起得晚,所以小Z没法去食堂买早餐,只能够顺路购买。小Z希望找到一条去新校最短的路线,如果存在多条总距离最短的路线,输出拥堵值最小的路线,如果拥堵值仍然相同,输出美味值最大的那条线路(小Z是个爱学习的好孩子,为了上课不迟到,有时只能狠心不吃美味的早餐了┭┮﹏┭┮)
Input
第一行为一个正整数 T ,代表数据组数(不超过 15 组)
第二行为两个正整数 n,m ,代表路口数和道路数(1≤n≤1000,n−1≤m≤n(n−1)/2)
其中 1 代表学生公寓路口, n 代表新校路口
之后 m 行,每行 5 个数 u,v,x,y,z
u,v 代表这条道路连接的两个路口,
x 代表这条道路的长度(1≤x≤1000 ),
y 代表这条道路的拥堵值(0≤y≤1000 ),
z 代表这条道路的美味值(0≤z≤1000 )。
Output
第一行输出三个正整r1,r2,r3 ,代表符合题意最优的那条路径的总距离,拥堵值和美味值
(数据保证总距离最小、拥堵值最小、美味值最大的路径是存在且唯一的)
接着顺序输出路径上经过的地点(以 1 开头,以 n 结束)
具体参见样例
Sample Input
1
4 6
1 2 1 3 5
2 4 2 2 0
1 4 3 6 2
2 3 4 5 3
1 3 1 2 4
3 4 2 3 2
Sample Output
3 5 6
1 3 4 思路:由题意我们可以知道我们要求的目的是求从1-n的条路径,这条路径满足总距离最小、拥堵值最小、美味值最大的路径,就相当于我们首先要求出总距离最小,在总距离最小的情况下求拥堵值最小,在总距离最小和拥堵值最小的情况下
求美味值最大,那么这题就是一个满足多个条件的最短路,我们可以使用dijkstra算法来写,dijkstra能够求出一点到任意一点的最短路径(正权情况下),就是模板上改动判断条件就行了。
可以看代码的注释理解一下。
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <vector>
#include <queue>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int maxn=;
int n,m;
struct Edge
{
int from,to,x,y,z;
Edge(int u,int v,int xx,int yy,int zz):from(u),to(v),x(xx),y(yy),z(zz){}
};
struct Node
{
int id,wx,wy,wz;
bool operator < (const Node& b) const//重载 < 符号,按照我们要求,优先级不同
{
if(wx==b.wx)
{
if(wy==b.wy)
return wz<b.wz;
else
return wy>b.wy;
}
else
return wx>b.wx;
}
};
bool vis[maxn];
int disx[maxn],disy[maxn],disz[maxn],order[maxn];//因为有三个权值,故开三个权值数组
vector<int>G[maxn];
vector<Edge>edge; void init()
{
for(int i=;i<=n;i++)
G[i].clear();
edge.clear();
memset(order,-,sizeof(order));
}
void addedge(int f,int t,int aa,int bb,int cc)
{
edge.push_back(Edge(f,t,aa,bb,cc));
int si=edge.size();
G[f].push_back(si-);
edge.push_back(Edge(t,f,aa,bb,cc));
si=edge.size();
G[t].push_back(si-);
}
void dijkstra(int sta)
{
memset(vis,,sizeof(vis));
priority_queue<Node>q;
for(int i=;i<=n;i++)
disx[i]=disy[i]=disz[i]=INF;
disx[sta]=disy[sta]=disz[sta]=;
q.push((Node){sta,,,});
while(!q.empty())
{
Node temp=q.top();
q.pop();
int u=temp.id;
if(vis[u])
continue;
vis[u]=true;
int len=G[u].size();
for(int i=;i<len;i++)
{
Edge& e=edge[G[u][i]];
if(disx[e.to]>disx[u]+e.x)//先求距离最小
{
disx[e.to]=disx[u]+e.x;
disy[e.to]=disy[u]+e.y;
disz[e.to]=disz[u]+e.z;
q.push((Node){e.to,disx[e.to],disy[e.to],disz[e.to]});
order[e.to]=u;
}
else if(disx[e.to]==disx[u]+e.x&&disy[e.to]>disy[u]+e.y)//距离相等求拥堵值最小
{
disy[e.to]=disy[u]+e.y;
disz[e.to]=disz[u]+e.z;
q.push((Node){e.to,disx[e.to],disy[e.to],disz[e.to]});
order[e.to]=u;
}
else if(disx[e.to]==disx[u]+e.x&&disy[e.to]==disy[u]+e.y&&disz[e.to]<disz[u]+e.z)//距离和拥堵值相等时求美味值最大
{
disz[e.to]=disz[u]+e.z;
q.push((Node){e.to,disx[e.to],disy[e.to],disz[e.to]});
order[e.to]=u;
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&m);
init();
int u,v,a,b,c;
while(m--)
{
scanf("%d %d %d %d %d",&u,&v,&a,&b,&c);
addedge(u,v,a,b,c);
}
dijkstra(n);
printf("%d %d %d\n",disx[],disy[],disz[]);
for(int i=;i!=-;i=order[i])
{
if(i==)
printf("%d",i);
else
printf(" %d",i);
}
printf("\n");
}
return ;
} /**********************************************************************
Problem: 2161
User: jk1601zr
Language: C++
Result: AC
Time:964 ms
Memory:19812 kb
**********************************************************************/
CSU——2161: 漫漫上学路 最短路的更多相关文章
- ACM :漫漫上学路 -DP -水题
CSU 1772 漫漫上学路 Time Limit: 1000MS Memory Limit: 131072KB 64bit IO Format: %lld & %llu Submit ...
- Bzoj 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路 最短路,floyd
1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5 ...
- zoj 3088 Easter Holidays(最长路+最短路+打印路径)
Scandinavians often make vacation during the Easter holidays in the largest ski resort Are. Are prov ...
- 【UVA10816】Travel in Desert (最小瓶颈路+最短路)
UVA10816 Travel in Desert 题目大意 沙漠中有一些道路,每个道路有一个温度和距离,要求s,t两点间的一条路径,满足温度最大值最小,并且长度最短 输入格式 输入包含多组数据. 每 ...
- [SHOI2012]回家的路 最短路
---题面--- 题解: 吐槽:找了好久的错,换了n种方法,重构一次代码,,,, 最后发现,,, 数组开小了,其实一开始尝试开大了数组,但唯独没有尝试开大手写队列的数组.... 思路: 有两种方法,这 ...
- 洛谷P1613 跑路(最短路+倍增)
P1613 跑路 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的 ...
- BZOJ 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路( 最短路 )
直接floyd.. ----------------------------------------------------------------------- #include<cstdio ...
- BZOJ.2834.回家的路(最短路Dijkstra 拆点)
题目链接 对于相邻的.处在同在一行或一列的车站连边,然后用dis[x][0/1](或者拆点)分别表示之前是从横边还是竖边到x的,跑最短路. 我选择拆点.. //13028kb 604ms #inclu ...
- BZOJ 1266 上学路线(最短路+最小割)
给出n个点的无向图,每条边有两个属性,边权和代价. 第一问求1-n的最短路.第二问求用最小的代价删边使得最短路的距离变大. 对于第二问.显然该删除的是出现在最短路径上的边.如果我们将图用最短路跑一遍预 ...
随机推荐
- tar.xz格式文件的解压方法(转载)
转自:http://bbs.chinaunix.net/thread-3610738-1-1.html 现在很多找到的软件都是tar.xz的格式的,xz 是一个使用 LZMA压缩算法的无损数据压缩文件 ...
- HDU1253:胜利大逃亡
传送门 题意 逃离迷宫 分析 用优先队列和队列都可以,但是我vis数组写在取队列首节点就MLE了,放在放入节点的地方就ac了,看来是一种固定写法,在放入节点的地方判断,可以防止放入无效点到队列,防止队 ...
- java-使用反射实现ORM映射
自定义两个注解 package com.moon.ROM; import java.lang.annotation.ElementType; import java.lang.annotation.R ...
- 把pdf传给kindle
对于不是纯文本的,最好主题不要用convert,虽说用了之后可以转换为大小更合适的字体,但是会破坏本来PDF的格式,变得更加不合适阅读
- Linux基本命令—mkfs/mount/umount/wget/yes/make/passwd
mkfs:用来在特定的分区建立Linux文件系统,是make filesystem的缩写. 例子:mkfs .ext3 /dev/mmcblk0p1 //把该设备格式化成ext3文件系统 m ...
- 进击的Python【第七章】:python各种类,反射,异常处理和socket基础
Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...
- Class.getResourceAsStream()与ClassLoader.getResourceAsStream()获取资源时的路径说明
Class.getResourceAsStream(): com.xusweeter.iot.ws.vodafone.config.VodafoneServiceConfig.class.getRes ...
- Python的数据类型:list和tuple
今天开始认真的学习python. 1.list类型 list是python的一种数据类型,它是一种有序列表,可以随时添加和删除其中的元素. 1.1 list类型的特征 list类型内的成员类型可以相同 ...
- 掌握Spark机器学习库-02-mllib数据格式
MLlib 1.MLlib介绍 1)MLlib特点 2)哪些算法 3)阅读官方文档 MLlib提供了哪些: 算法 特征工程 管道 持久化 2.MLlib数据格式 1)本地向量 2)标签数据 3)本地矩 ...
- SceneAction$$FastClassByCGLIB$$7330f7b9.invoke(int, Object, Object[]) line: not available
现象:在调试状态下,断点可以进入ACTION ,当调用service的时候,发现无法进入service中的断点,就报了题目中的错误. 过程:1.降低JDK.因为本工程是用JDK1.6编译的,maven ...