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: 漫漫上学路 最短路的更多相关文章

  1. ACM :漫漫上学路 -DP -水题

    CSU 1772 漫漫上学路 Time Limit: 1000MS   Memory Limit: 131072KB   64bit IO Format: %lld & %llu Submit ...

  2. 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 ...

  3. zoj 3088 Easter Holidays(最长路+最短路+打印路径)

    Scandinavians often make vacation during the Easter holidays in the largest ski resort Are. Are prov ...

  4. 【UVA10816】Travel in Desert (最小瓶颈路+最短路)

    UVA10816 Travel in Desert 题目大意 沙漠中有一些道路,每个道路有一个温度和距离,要求s,t两点间的一条路径,满足温度最大值最小,并且长度最短 输入格式 输入包含多组数据. 每 ...

  5. [SHOI2012]回家的路 最短路

    ---题面--- 题解: 吐槽:找了好久的错,换了n种方法,重构一次代码,,,, 最后发现,,, 数组开小了,其实一开始尝试开大了数组,但唯独没有尝试开大手写队列的数组.... 思路: 有两种方法,这 ...

  6. 洛谷P1613 跑路(最短路+倍增)

    P1613 跑路 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的 ...

  7. BZOJ 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路( 最短路 )

    直接floyd.. ----------------------------------------------------------------------- #include<cstdio ...

  8. BZOJ.2834.回家的路(最短路Dijkstra 拆点)

    题目链接 对于相邻的.处在同在一行或一列的车站连边,然后用dis[x][0/1](或者拆点)分别表示之前是从横边还是竖边到x的,跑最短路. 我选择拆点.. //13028kb 604ms #inclu ...

  9. BZOJ 1266 上学路线(最短路+最小割)

    给出n个点的无向图,每条边有两个属性,边权和代价. 第一问求1-n的最短路.第二问求用最小的代价删边使得最短路的距离变大. 对于第二问.显然该删除的是出现在最短路径上的边.如果我们将图用最短路跑一遍预 ...

随机推荐

  1. 学习Python到写poc其实没那么难

    现在,开始! 0x00 前言 今天刚刚把http://drops.wooyun.org/tips/12751放到收藏夹准备看的,然后又看到题主的这个问题.顺便观摩了1楼大神的博客,我这种炒鸡新手表示很 ...

  2. An internal error occurred during: "Launching MVC on Tomcat 6.x". java.lang.NullPointerException

    有的时候打开Myeclispe莫名奇妙的就出现了这样的问题: An internal error occurred during: "Launching MVC on Tomcat  6.x ...

  3. poj 1149 PIGS【最大流】

    建图:s向所有猪圈的第一个顾客连流量为这个猪圈里住的数量,然后对于之后每个来这个猪圈的顾客,由他前一个顾客向他连边权为无穷的边,然后每个顾客向t连流量为这个顾客购买上限的边.然后跑最大流 #inclu ...

  4. Phoenix数据覆盖的一种解决方案

    最近在做实时数仓,需要兼顾离线和实时两种查询方式,大致的方案是数据通过binlog抽取,经Phoenix插入,hive映射hbase表:Phoenix创建索引,实时查询Phoenix:离线查询hive ...

  5. shiro 登录

    @Controllerpublic class LoginController { @RequestMapping(value="/login") public @Response ...

  6. 为HttpClient和HttpURLConnection添加中国移动代理

    转自: http://www.2cto.com/kf/201111/112100.html 在android中,一般需要联网的时候前,都要做一次网络的判断,判断当前的网络状态!然后开始请求网络 当我们 ...

  7. 16-6 WEB存储-通讯录实战

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. vue项目导出电子表格

    方法一: 一.安装依赖(前面基本一样) npm install file-saver --save npm install xlsx --save npm install script-loader ...

  9. ORA-00445: Background Process "xxxx" Did Not Start After 120 Seconds

    Recent linux kernels have a feature called Address Space Layout Randomization (ASLR).ASLR  is a feat ...

  10. 设置webbrowser浏览器内核

    var hklm = Microsoft.Win32.Registry.LocalMachine;            var lmRun64 = hklm.OpenSubKey(@"SO ...