bzoj3245

原创 2018年04月14日 23:39:29

http://www.elijahqi.win/archives/799
Description

精明的小R每每开车出行总是喜欢走最快路线,而不是最短路线.很明显,每条道路的限速是小R需要考虑的关键问题.不过有一些限速标志丢失了,于是小R将不知道能开多快.不过有一个合理的方法是进入这段道路时不改变速度行驶.你的任务就是计算从小R家(0号路口)到D号路口的最快路线.
现在你得到了这个城市的地图,这个地图上的路都是单向的,而且对于两个路口A和B,最多只有一条道路从A到B.并且假设可以瞬间完成路口的转弯和加速.
Input

第一行是三个整数N,M,D(路口数目,道路数目,和目的地). 路口由0…N-1标号
接下来M行,每行描述一条道路:有四个整数A,B,V,L,(起始路口,到达路口,限速,长度) 如果V=0说明这段路的限速标志丢失.
开始时你位于0号路口,速度为70.
Output

仅仅一行,按顺序输出从0到D经过的城市.保证最快路线只有一条.
Sample Input

6 15 1
0 1 25 68
0 2 30 50
0 5 0 101
1 2 70 77
1 3 35 42
2 0 0 22
2 1 40 86
2 3 0 23
2 4 45 40
3 1 64 14
3 5 0 23
4 1 95 8
5 1 0 84
5 2 90 64
5 3 36 40
Sample Output

0 5 2 3 1
HINT

【数据范围】

30% N<=20

100% 2<=N<=150;0<=V<=500;1<=L<=500

不是很想写dijkstra毕竟要写两个pair还有priority_queue

一到晚上,颈椎不舒服的时候,躺床上就容易不小心睡着,刚刚就是不小心又睡着了
怎么评价这题呢,和jloi还有usaco的那些题都非常像,也是相当于dp的思想吧(跪求自己记住这种思路x)

http://blog.csdn.net/popoqqq/article/details/38926889

参照了下popoqqq如何给double memset赋值x(顺便看了金牌爷的经历)瞬间%%

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define pa pair<int,int>
#define N 155
inline int read(){
    int x=0;char ch=getchar();
    while (ch<'0'||ch>'9') ch=getchar();
    while (ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
    return x;
}
struct node{
    int y,next,v,len;
}data[N*N];
queue<pa> q;
pa from[N][550];bool flag[N][550];double f[N][550];
int h[N],n,m,d,num;
void spfa(){
    q.push(make_pair(0,70));flag[0][70]=true;
    memset(f,0x42,sizeof(f));f[0][70]=0;
    while (!q.empty()){
        int x=q.front().first,vx=q.front().second;q.pop();flag[x][vx]=false;
        for (int i=h[x];i;i=data[i].next){
            int y=data[i].y,v=data[i].v,len=data[i].len;
            if (v){
                if (f[x][vx]+(double)len/v<f[y][v]){
                    f[y][v]=f[x][vx]+(double)len/v;
                    q.push(make_pair(y,v));flag[y][v]=true;from[y][v]=make_pair(x,vx);
                }
            }else{
                if (f[x][vx]+(double)len/vx<f[y][vx]){
                    f[y][vx]=f[x][vx]+(double) len/vx;
                    q.push(make_pair(y,vx));flag[y][vx]=true;from[y][vx]=make_pair(x,vx);
                }
            }

        }
    }
}
void print(int t,int v){
    if (t!=0) print(from[t][v].first,from[t][v].second);
    printf("%d",t);
    if (t!=d) printf(" ");
}
int main(){
    freopen("bzoj3245.in","r",stdin);
    n=read();m=read();d=read();
    for (int i=1;i<=m;++i){
        int a=read(),b=read(),v=read(),l=read();
        data[++num].y=b;data[num].next=h[a];data[num].v=v;data[num].len=l;h[a]=num;
    }
    spfa();
    int ans=0;
    for (int i=1;i<=500;++i) if(f[d][i]<f[d][ans]) ans=i;
    print(d,ans);
    return 0;
}
版权声明:辣鸡蒟蒻的blog https://blog.csdn.net/elijahqi/article/details/79945716

BZOJ3245 最快路线

考虑一下最短路,但是有的边边权是不确定的,我们在spfa的时候把这些边推到另一个队列里,spfa完事之后取出边权不定的边的队列里的一个边,找到能使他边权最小的前一个边后暂时定下这条边的边权,然后从这条...
  • neither_nor
  • neither_nor
  • 2016-06-17 21:58:03
  • 520

【bzoj3245】 最快路线 spfa

不错的题,裸的spfa,第一想法就是记录一下到点i的速度,然后可以理解为二维的拆点spfa吧。 #include #include #include #include #include #incl...
  • u012288458
  • u012288458
  • 2015-09-18 09:52:58
  • 440

bzoj 3245 spfa

题意:n个点,编号为0~n-1,m条有向边,限速不为0的边按照限速前进,限速为0的边按进入这条道路时的速度前进(即到该条边起点的速度),给定终点,初始起点为点0,初始速度为70,问从点0到终点最快时间...
  • Eirlys_North
  • Eirlys_North
  • 2017-02-26 19:30:04
  • 148

[ spfa ] BZOJ3245

fi,jf_{i,j} 表示到 ii 号点,速度为 jj 的最小代价,spfa就行了。#include #include #include #include #include using namesp...
  • gjghfd
  • gjghfd
  • 2017-12-21 20:06:02
  • 74

【bzoj3245】【最快路线】【spfa】

Description 精明的小R每每开车出行总是喜欢走最快路线,而不是最短路线.很明显,每条道路的限速是小R需要考虑的关键问题.不过有一些限速标志丢失了,于是小R将不知道能开多快.不过有一个合...
  • sunshinezff
  • sunshinezff
  • 2016-04-13 17:48:43
  • 348

bzoj3245 最快路线(二维?spfa)

只记到每个点的最小时间显然是不行的。我们还需要知道到这个点的速度是多少。因此我们用d[i][j]表示到i,速度为j的最小时间。最后因为要输出路径,所以我们再记录一个from数组,表示d[i][j]取到...
  • Icefox_zhx
  • Icefox_zhx
  • 2017-09-07 16:12:00
  • 118

BZOJ3245: 最快路线 拆点dijkstra

150个点,500种速度,乘起来大概8e4个点,3e4的边 其他题解写的基本都是spfa,想想dij也能做,还挺快 #include //#pragma comment(linker, "/S...
  • qq_34927456
  • qq_34927456
  • 2018-01-17 16:39:55
  • 80
收藏助手
不良信息举报
您举报文章:bzoj3245
举报原因:
原因补充:

(最多只允许输入30个字)