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

O - Extended Traffic(判断负环)

时间:2015-07-20 15:59:04      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

题意:有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;
}

O - Extended Traffic(判断负环)

标签:

原文地址:http://www.cnblogs.com/liuxin13/p/4661348.html

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