zoukankan      html  css  js  c++  java
  • CSU 1333 Funny Car Racing

    最短路问题稍微复杂了一点,松弛的时候多判断一些条件就可以了。第一次用SPFA写最短路。

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    
    const int maxn = 305;
    vector<int> cost[maxn][maxn];
    vector<int> ljb[maxn];
    struct abc{ int start, end, aa, bb, cc; }dt[50005];
    int flag[maxn], dist[maxn];
    int n, m, sx, ex;
    
    void spfa()
    {
        int i, ii; flag[sx] = 1;
        for (i = 0; i <= n; i++) dist[i] = 0x7FFFFFFF;
        dist[sx] = 0;
        queue<int>Q; Q.push(sx);
        while (!Q.empty())
        {
            int hh = Q.front(); Q.pop(); flag[hh] = 0;
            int nowtime = dist[hh];
            for (ii = 0; ii < ljb[hh].size(); ii++)
            {
                for (i = 0; i < cost[hh][ljb[hh][ii]].size(); i++)
                {
                    int id = cost[hh][ljb[hh][ii]][i];
                    if (dt[id].aa < dt[id].cc) continue;
                    int yy = nowtime % (dt[id].aa + dt[id].bb);
                    if (yy <= dt[id].aa)
                    {
                        if (yy + dt[id].cc <= dt[id].aa)
                        {
                            if (nowtime + dt[id].cc < dist[ljb[hh][ii]])
                            {
                                dist[ljb[hh][ii]] = nowtime + dt[id].cc;
                                if (!flag[ljb[hh][ii]])Q.push(ljb[hh][ii]), flag[ljb[hh][ii]] = 1;
                            }
                        }
                        else
                        {
                            if (nowtime + dt[id].aa - yy + dt[id].bb + dt[id].cc < dist[ljb[hh][ii]])
                            {
                                dist[ljb[hh][ii]] = nowtime + dt[id].aa - yy + dt[id].bb + dt[id].cc;
                                if (!flag[ljb[hh][ii]])Q.push(ljb[hh][ii]), flag[ljb[hh][ii]] = 1;
                            }
                        }
                    }
                    else
                    {
                        if (nowtime + dt[id].aa + dt[id].bb - yy + dt[id].cc< dist[ljb[hh][ii]])
                        {
                            dist[ljb[hh][ii]] = nowtime + dt[id].aa + dt[id].bb - yy + dt[id].cc;
                            if (!flag[ljb[hh][ii]])Q.push(ljb[hh][ii]), flag[ljb[hh][ii]] = 1;
                        }
                    }
                }
            }
        }
    }
    
    int main()
    {
        int _ = 1;
        int i, j, u, v, a, b, c;
        while (~scanf("%d%d%d%d", &n, &m, &sx, &ex))
        {
            for (i = 0; i <= n; i++) ljb[i].clear();
            for (i = 0; i <= n; i++) for (j = 0; j <= n; j++) cost[i][j].clear();
            memset(flag, 0, sizeof(flag));
            for (i = 0; i < m; i++)
            {
                scanf("%d%d%d%d%d", &u, &v, &a, &b, &c);
                dt[i].start = u; dt[i].end = v;
                dt[i].cc = c; dt[i].aa = a; dt[i].bb = b;
                cost[u][v].push_back(i);
                ljb[u].push_back(v);
            }
            spfa();
            printf("Case %d: %d
    ", _++, dist[ex]);
        }
        return 0;
    }
  • 相关阅读:
    loj#2049. 「HNOI2016」网络(set 树剖 暴力)
    创建多个Oracle数据库及相应的实例
    [置顶] lua 进阶3--lua文件中调用C++函数
    android 设置Button或者ImageButton的背景透明 半透明 透明
    struts2 18拦截器详解(七)
    《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记
    ios7下不能录音问题解决
    360 2013校园招聘笔试题(含参考答案)
    【MFC三天一个游戏】之 局域网黑白棋
    Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4506817.html
Copyright © 2011-2022 走看看