• LightOJ1074Extended Traffic(bellman_ford最短路+负环标记)


    题意

    T组样例,N个地点,每个地点有个繁忙度,地点间有M条街道,每条街道要收过路费(目的地繁忙度-起点繁忙度)^3 (3次方),有Q个查询,包含Q个目的地,求从起点1到每个目的地的最小花费。如果花费小于3或者无法到达目的地,则输出"?"

    解题思路

    由于目的地繁忙度不一定大于起点繁忙度,所以图中有负环(一开始没想到,直接用dijkstra一直WA),所以要用bellman_ford来求最短路,当某些地点位于负环内,就肯定最终花费小于3。

    AC代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    const int maxn = 1e3+5;
    const int maxm = 1e6+5;
    const int inf = 0x2f3f3f3f;         //这里给值小于初始dis数组赋值,原因可能是在跑bellman_ford的时候,负环和目的地的值相加变小了,直接判断目的地的值等于初始值的话,会wa
    int N,M;
    int A[maxn];
    struct Edge 
    {
        int from,to,cost;
    };
    int dis[maxn];
    bool vis[maxn];
    Edge G[maxm];
    
    void bellman_ford()
    {
        memset(dis,0x3f,sizeof(dis));
        dis[1] = 0;
        for(int i=1;i<=N;i++){
            for(int j=0;j<M;j++){
                Edge e = G[j];
                if(dis[e.from] + e.cost < dis[e.to]){
                    dis[e.to] = e.cost + dis[e.from];
                    if(i==N){
                        vis[e.from] = 1;    //
                        vis[e.to] = 1;      //标记负环内结点
                    }
                }
            }
        }
    }
    
    int main(int argc, char const *argv[])
    {
        int T = 0;
        cin >> T;
        int Case = 1;
        while(T--){
            cin >> N;
            for(int i=1;i<=N;i++){
                cin >> A[i];
            }
            cin >> M;
            int a,b;
            Edge e;
            memset(vis,0,sizeof(vis));
            for(int i=0;i<M;i++){
                cin >> a >> b;
                e.from = a;
                e.to = b;
                e.cost = pow(A[b]-A[a],3);
                G[i] = e;
            }
            int Q = 0;
            cin >> Q;
            cout << "Case " << Case++ << ":" << endl;
            bellman_ford();
            for(int i=0;i<Q;i++){
                int t = 0;
                cin >> t;
                if(dis[t] < 3 || dis[t]>=inf || vis[t]){
                    cout << "?" << endl;
                }else{
                    cout << dis[t] << endl;
                }
            }
        }
        
        return 0;
    }
    
  • 相关阅读:
    swift 函数
    Javascript中的apply与call详解
    SQL语句中----删除表数据drop、truncate和delete的用法
    jquery对象和DOM对象转换
    js正则函数match、exec、test、search、replace、split使用介绍集合
    JS中类或对象的定义说明
    SQL PROMPT5.3.4.1的一些设置选项
    jQuery 遍历函数
    前端开发面试题
    SQLServer中ISNULL和CONVERT函数
  • 原文地址:https://www.cnblogs.com/django-lf/p/9739450.html
Copyright © 2020-2023  润新知