J - Invitation Cards

题目大意:邀请卡
在电视的时代,没有多少人会去剧院观看演出。古老的喜剧演员
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\n", sumPay);
    }

    return 0;

} 

posted @ 2015-07-18 13:35  无忧望月  阅读(691)  评论(0编辑  收藏  举报
levels of contents