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的最短路.第二问求用最小的代价删边使得最短路的距离变大. 对于第二问.显然该删除的是出现在最短路径上的边.如果我们将图用最短路跑一遍预 ...
随机推荐
- jsp请求转发小例子(转载)
在服务器端对客户端请求时行转发对其它的对象,如果jsp网页或Servlet 用三个 jsp网页来演示转发: forword1.jsp, 用来提交表单, 将表单内容提交给 forwrod2.jsp, ...
- Linux 常用命令六 cp和mv
一.cp命令 Linux中的复制命令. 复制文件: wang@wang:~/workpalce/python$ tree . ├── .txt ├── dir └── module directori ...
- 51nod 1244 莫比乌斯函数之和 【莫比乌斯函数+杜教筛】
和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\mu(i) \ ...
- Linux下firefox安装flash player插件
下载插件 解压插件 使用命令tar -zxvf install_xxxxxx libflashplayer.so 拷贝目录 然后把切换到root用户,把文件夹拷贝到/usr/lib/mozilla/p ...
- bzoj1303[CQOI2008]中位数图 / 乱搞
题目描述 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. 输入输出格式 输入格式: 第一行为两个正整数n和b,第二行为1 ...
- java基本数据类型所占字节数
JAVA基本数据类型所占字节数是多少?(32位系统) byte 1字节 short 2字节 int 4字节 ...
- poj 3295 Tautology 伪递归
题目链接: http://poj.org/problem?id=3295 题目描述: 给一个字符串,字符串所表示的表达式中p, q, r, s, t表示变量,取值可以为1或0.K, A, N, C, ...
- Android上的线程安全
Thread-safe methods In some situations, the methods you implement might be called from more than one ...
- IIS7 网站发布
选择“网站” 添加网站
- AJPFX编写cmd界面下一键编译、执行java代码的bat脚本
此脚本适合刚接触java的同学,在cmd界面下用jc取代 复杂的 javac *.java + java main使用说明:把脚本内容复制到txt文本中,修改后缀名为.bat,运行一次即可完成配置, ...