• J


    题目大意:邀请卡
    在电视的时代,没有多少人会去剧院观看演出。古老的喜剧演员
    Malidinesia知道这个事实。他们想传播戏剧尤其是古老的戏剧,他们在邀请卡上打印必要的信息和一些节目,一些学生被雇佣过来发传单,每个学生志愿者都被分配一个公共汽车站来发传单,一个特殊的课程教会了学生们如何影响别人。
    这个运输系统(公路)非常的特别:所有的线路都是单向的,并且恰好都有两个站点相连(就是说没有交叉的路,因为交叉的地方都变成了站点),汽车从起点载着旅客出发然后到达目的地后空车返回用半个小时??(是到达用半个小时还是来回....),然后他们在那里等待下一个完整的半小时,两站之间现场付款,,,,(废话太多了,不翻译了,直接看数据)。
    就是说这帮人现在一个叫做ccs(默认1号站)的地方集合然后乘坐公交车到达每一个车站,然后晚上从车站回来,求最少的总花费......跟那个D一模一样,题目一大堆废话。。。。。。。。。。。。。。
    不过pq的范围很恐怖。。1百万,,什么城市有这么多车站。。。。我去
    /////////////////////////////////////////////////////////////////////////
    我小瞧了这道题,卡时间卡的特别厉害,而且还需要用long long,vector效率是非常低的,决定放弃vector,使用数组模拟链表
    #include<algorithm>
    #include<stack>
    #include<stdio.h>
    #include<string.h>
    #include<vector>
    #include<string>
    #include<map>
    #include<iostream>
    using namespace std;

    const int maxn = 1000005;
    const int oo = 0x3fffffff;

    struct BusStation
    {
        int u, v, nextBus;
        long long pay;
    }ege[maxn], data[maxn];

    int head[maxn];
    long long dis[maxn];
    bool use[maxn];

    void Add(int u, int v, long long w, int k)
    {
        data[k].u = u;
        data[k].v = v;
        data[k].pay = w;
        data[k].nextBus = head[u];
        head[u] = k;
    }

    long long spfa(int N)
    {
        stack<int> Q;
        Q.push(1);
        use[1] = true;

        for(int i=1; i<=N; i++)
            dis[i] = oo;
        dis[1] = 0;

        while(Q.size())
        {
            int i = Q.top();Q.pop();
            use[i] = false;

            for(int j=head[i]; j != 0; j = data[j].nextBus)
            {
                int u = data[j].u, v = data[j].v;
                int pay = data[j].pay;

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

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

        long long sum=0;

        for(int i=1; i<=N; i++)
            sum += dis[i];

        return sum;
    }

    int main()
    {
        int T;

        scanf("%d", &T);

        while(T--)
        {
            int i, N, M;

            scanf("%d%d", &N, &M);

            memset(head, 0sizeof(head));
            for(i=1; i<=M; i++)
            {
                scanf("%d%d%lld", &ege[i].u, &ege[i].v, &ege[i].pay);
                Add(ege[i].u, ege[i].v, ege[i].pay, i);
            }

            long long sumPay;

            sumPay =  spfa(N);

            memset(head, 0sizeof(head));
            for(i=1; i<=M; i++)
                Add(ege[i].v, ege[i].u, ege[i].pay, i);

            sumPay += spfa(N);

            printf("%lld ", sumPay);
        }

        return 0;

    } 

  • 相关阅读:
    文字编码
    各个地区的编码
    Android中调用系统所装的软件打开文件
    Android中检测手机制式和移动网络类型
    Android使用ContentProvide(内容提供者)向其他应用程序共享数据
    windows Phone Push Notification
    解决Android加载图片时内存溢出的问题
    Android 正则表达式
    淡定
    Android简单数据存储类SharedPreferences详解及实例
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4656746.html
Copyright © 2020-2023  润新知