zoukankan      html  css  js  c++  java
  • (简单) LightOJ 1074 Extended Traffic,SPFA+负环。

      Description

      Dhaka city is getting crowded and noisy day by day. Certain roads always remain blocked in congestion. In order to convince people avoid shortest routes, and hence the crowded roads, to reach destination, the city authority has made a new plan. Each junction of the city is marked with a positive integer (≤ 20) denoting the busyness of the junction. Whenever someone goes from one junction (the source junction) to another (the destination junction), the city authority gets the amount (busyness of destination - busyness of source)3 (that means the cube of the difference) from the traveler. The authority has appointed you to find out the minimum total amount that can be earned when someone intelligent goes from a certain junction (the zero point) to several others.

      题目就是求最短路问题,但是可能存在负环,存在的话就需要标记所有负环上的点,输出?。

      (但是坑的是判断到负环直接退出居然也AC了。。。。。。)

    代码如下:

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
        
    using namespace std;
    
    const int MaxN=300;
    const int MaxM=MaxN*MaxN;
    const int INF=10e8;
    
    struct Edge
    {
        int to,next,cost;
    };
    
    Edge E[MaxM];
    int head[MaxN],Ecou;
    bool vis[MaxN];
    int couNode[MaxN];
    bool cir[MaxN];
    
    void init(int N)
    {
        Ecou=0;
    
        for(int i=1;i<=N;++i)
            head[i]=-1,vis[i]=0,cir[i]=0;
    }
    
    void addEdge(int u,int v,int c)
    {
        E[Ecou].to=v;
        E[Ecou].cost=c;
        E[Ecou].next=head[u];
        head[u]=Ecou++;
    }
    
    void dfs(int u)
    {
        cir[u]=1;
    
        for(int i=head[u];i!=-1;i=E[i].next)
            if(!cir[E[i].to])
                dfs(E[i].to);
    }
    
    bool SPFA(int lowcost[],int N,int start)
    {
        queue <int> que;
        int u,v,c;
    
        for(int i=1;i<=N;++i)
            lowcost[i]=INF,couNode[i]=0;
        lowcost[start]=0;
    
        que.push(start);
        vis[start]=1;
        couNode[start]=1;
    
        while(!que.empty())
        {
            u=que.front();
            que.pop();
    
            vis[u]=0;            // !!!
    
            for(int i=head[u];i!=-1;i=E[i].next)
            {
                v=E[i].to;
                c=E[i].cost;
    
                if(cir[v])
                    continue;
    
                if(lowcost[v]>lowcost[u]+c)
                {
                    lowcost[v]=lowcost[u]+c;
    
                    if(!vis[v])
                    {
                        vis[v]=1;
                        que.push(v);
    
                        ++couNode[v];
    
                        if(couNode[v]>N)
                            dfs(v);
                    }
                }
            }
        }
    
        return 1;
    }
    
    int ans[MaxN];
    int val[MaxN];
    
    inline int cube(int x)
    {
        return x*x*x;
    }
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
    
        int T;
        int N,Q,M;
        int a,b;
        int cas=1;
    
        scanf("%d",&T);
    
        while(T--)
        {
            scanf("%d",&N);
            init(N);
    
            for(int i=1;i<=N;++i)
                scanf("%d",&val[i]);
    
            scanf("%d",&M);
            while(M--)
            {
                scanf("%d %d",&a,&b);
                addEdge(a,b,cube(val[b]-val[a]));
            }
    
            SPFA(ans,N,1);
    
            scanf("%d",&Q);
    
            printf("Case %d:
    ",cas++);
    
            while(Q--)
            {
                scanf("%d",&a);
    
                if(cir[a] || ans[a]<3 || ans[a]==INF)
                    printf("?
    ");
                else
                    printf("%d
    ",ans[a]);
            }
        }
        
        return 0;
    }
    View Code
  • 相关阅读:
    Anaconda3的Jupyter notebook调用ArcGISPro的Arcpy
    ArcMap 创建空间邻接矩阵
    Anaconda3的Jupyter notebook切换Python3和Python2环境并调用Arcpy
    PHP.MVC的模板标签系统(二)
    PHP汉字转拼音的类
    Linux 解压命令大全
    ASP应用之模板采用
    PHP中的串行化变量和序列化对象(一)
    CSS常用技巧介绍
    ASP实现多图片上传(一)
  • 原文地址:https://www.cnblogs.com/whywhy/p/4338474.html
Copyright © 2011-2022 走看看