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;

} 

你可能感兴趣的:(IO)