zoukankan      html  css  js  c++  java
  • O

    题意:有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: ", t++);

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

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

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

        return 0;
    }
  • 相关阅读:
    HashMap 和HashTable
    两种方式获得键盘录入
    打印流 printStream
    对象操作流--存储对象
    内存输出流
    序列流
    装饰设计模式
    递归
    IO流(使用指定的码表读写字符)
    IO-字符流 练习
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4661348.html
Copyright © 2011-2022 走看看