O - Extended Traffic(判断负环)

题意:有n个城市,每一个城市有一个拥挤度ai,从一个城市I到另一个城市J的时间为:(aJ-aI)^3,存在负环。问从第一个城市到达第k个城市所话的时间,如果不能到达,或者时间小于3输出?否则输出所花的时间。。

这道题存在负环,而且所以要求出来所有负环(包括负环能到达的位置),可以用进队列的次数来判断

///////////////////////////////////////////////////////////////////////
#include<stdio.h>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#include< string.h>
#include<math.h>
using  namespace std;

const  int maxn =  100005;
const  int maxm =  205;
const  int oo =  0xfffffff;

struct node
{
     int u, v, c, next;
}e[maxn];
int dis[maxm], head[maxm];
int busy[maxn], p[maxn]; // p数组记录一共访问的次数
bool use[maxm];

void Add( int u,  int v,  int c,  int k)
{
    e[k].u = u;
    e[k].v = v;
    e[k].c = c*c*c;
    e[k].next = head[u];
    head[u] = k;
}
void spfa( int N)
{
    queue< int> Q;
    Q.push( 1);

     while(Q.size())
    {
         int i = Q.front();Q.pop();
        use[i] =  false, p[i]++;

         for( int j=head[i]; j!= 0; j=e[j].next)
        {
             int u = e[j].u, v = e[j].v, c = e[j].c;

             if(dis[u]+c < dis[v])
            {
                dis[v] = dis[u]+c;

                 if(use[v] ==  false && p[v] <= N)
                {
                    use[v] =  true;
                    Q.push(v);
                }
            }
        }
    }
}

int main()
{
     int T, t= 1;

    scanf( " %d ", &T);

     while(T--)
    {
         int i, N, M, k= 1, u, v;

        scanf( " %d ", &N);

         for(i= 1; i<=N; i++)
        {
            dis[i] = oo;
            head[i] =  0;
            p[i] =  0;
            scanf( " %d ", &busy[i]);
        }

        scanf( " %d ", &M);

         while(M--)
        {
            scanf( " %d%d ", &u, &v);
            Add(u, v, busy[v]-busy[u], k++);
        }

        scanf( " %d ", &M);
        printf( " Case %d:\n ", t++);

        dis[ 1] =  0;
        spfa(N);

         while(M--)
        {
            scanf( " %d ", &v);

             if(dis[v] == oo || dis[v] <  3 || p[v] > N)
                printf( " ?\n ");
             else
                printf( " %d\n ", dis[v]);
        }
    }

     return  0;
}

你可能感兴趣的:(extend)