码迷,mamicode.com
首页 > 其他好文 > 详细

P1266 速度限制

时间:2018-04-01 19:57:04      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:www   ref   add   while   ++   node   bool   end   name   

P1266 速度限制


第一次接触这种分层spfa

类似于dp 个人理解

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue> 
using namespace std;
struct node
{
    int p;
    int v;
    int l;
    int x;
};
struct que
{
    int p;
    int v;
};
queue<que>q;
node l[100000];
int h[501],t;
int pp[500][510],pv[500][510];
bool vis[500][510];
double map[500][510];
void add(int a,int b,int c,int d)
{
    l[++t].p=b;
    l[t].v=c;
    l[t].l=d;
    l[t].x=h[a];
    h[a]=t;
}
void print(int a,int b)
{
    if(a!=1)
        print(pp[a][b],pv[a][b]);
    printf("%d ",a-1);
}
int main()
{
    int n,m,end;
    scanf("%d%d%d",&n,&m,&end);
    end+=1;
    int a,b,c,d;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        a+=1;
        b+=1;
        add(a,b,c,d);
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=510;j++)
            map[i][j]=0x7ffffff;
    vis[1][70]=true;
    map[1][70]=0;
    que pa,net;
    pa.p=1;
    pa.v=70;
    q.push(pa);
    while(!q.empty())
    {
        pa=q.front();
        q.pop();
        vis[pa.p][pa.v]=false;
        for(int i=h[pa.p];i;i=l[i].x)
        {
            if(l[i].v==0)
            {
                if(map[l[i].p][pa.v]>1.0*map[pa.p][pa.v]+1.0*l[i].l/pa.v)
                {
                    map[l[i].p][pa.v]=1.0*map[pa.p][pa.v]+1.0*l[i].l/pa.v;
                    pp[l[i].p][pa.v]=pa.p;
                    pv[l[i].p][pa.v]=pa.v;
                    if(!vis[l[i].p][pa.v])
                    {
                        vis[l[i].p][pa.v]=true;
                        net.p=l[i].p;
                        net.v=pa.v;
                        q.push(net);
                    }
                }
            }
            else
            {
                if(map[l[i].p][l[i].v]>1.0*map[pa.p][pa.v]+1.0*l[i].l/l[i].v)
                {
                    map[l[i].p][l[i].v]=1.0*map[pa.p][pa.v]+1.0*l[i].l/l[i].v;
                    pp[l[i].p][l[i].v]=pa.p;
                    pv[l[i].p][l[i].v]=pa.v;
                    if(!vis[l[i].p][l[i].v])
                    {
                        vis[l[i].p][l[i].v]=true;
                        net.p=l[i].p;
                        net.v=l[i].v;
                        q.push(net);
                    }
                }
            }
        }
    }
    double minn=0x7ffffff;
    for(int i=1;i<=500;i++)
        if(minn>map[end][i])
        {
            minn=map[end][i];
            a=pp[end][i];
            b=pv[end][i];
        }
    print(a,b);
    printf("%d",end-1);
}

P1266 速度限制

标签:www   ref   add   while   ++   node   bool   end   name   

原文地址:https://www.cnblogs.com/Lance1ot/p/8687701.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!