POJ 1511 Invitation Cards

Invitation Cards

翻译:

描述

在电视时代,没有多少人参加戏剧表演。 Malidinesia古董喜剧演员知道这个事实。他们想传播戏剧,最重要的是古董喜剧。他们已经印制了包含所有必要信息和程序的邀请卡。许多学生被聘请将这些邀请分发给人们。每个学生志愿者都分配了一个公交车站,并且他或她在那里呆了一整天,并邀请乘坐公共汽车的人。学生学会了如何影响人们以及影响和抢劫的区别。

运输系统非常特殊:所有线路都是单向的,并且连接两个站点。公共汽车每半小时就与旅客一起离开始发站。到达目的地站点后,它们返回到原始站点,在那里等待直到下一个半小时,例如, X:00或X:30,其中'X'表示小时。两站之间的运输费用由特别表格支付,并在现场支付。线路的设计方式是每次往返(即在同一站点开始和结束的旅程)通过中央检查站(CCS),每个乘客必须通过包括全身扫描在内的全面检查。

所有的ACM学生成员每天早上离开CCS。每位志愿者都将前往一个预定的站点邀请乘客。志愿者的数量和站点一样多。在一天结束时,所有学生都会回到CCS。您需要编写一个计算机程序,帮助ACM减少每天为其员工的运输支付的金额。

输入

输入由N个案例组成。输入的第一行仅包含正整数N.然后遵循这些情况。每种情况都从一行包含恰好两个整数P和Q的行开始,1 <= P,Q <= 1000000。P是包括CCS的停止点的数量,Q是总线的数量。然后有Q行,每行描述一条总线。每一行都包含三个数字 - 原始站台,目的站台和价格。 CCS用编号1表示。价格是总和小于1000000000的正整数。您也可以假定始终可以从任何站点到任何其他站点。

输出

对于每一种情况,请打印一行,其中包含ACM每天要支付的最低金额,用于志愿者的差旅费用。


思想不难,做一下了解一下

通过连接反向边求解其他点到某一点的最短路

题意是求源点到所有点去的最短路和回来的最短路,多组数据


Code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define P pair <ll,ll >
#define ll long long
using namespace std;
const ll N=1000010;
ll head[N],edge[N<<1],to[N<<1],next[N<<1],cnt=1;
void add(ll u,ll v,ll w)
{
    next[++cnt]=head[u];to[cnt]=v;edge[cnt]=w;head[u]=cnt;
    next[++cnt]=head[v];to[cnt]=u;edge[cnt]=w;head[v]=cnt;
}
priority_queue <P,vector <P>,greater <P> > q;
ll diss[N],dist[N],used[N],n,m,ans=0;P p;
void disj()
{
    memset(diss,0x3f,sizeof(diss));
    memset(dist,0x3f,sizeof(dist));
    memset(used,0,sizeof(used));
    diss[1]=0,dist[1]=0;
    p.first=0,p.second=1;
    q.push(p);
    while(!q.empty())
    {
        ll u=q.top().second;
        q.pop();
        used[u]=1;
        for(ll i=head[u];i;i=next[i])
        {
            if(i&1)
            {
                ll v=to[i],w=edge[i];
                if(diss[v]>diss[u]+w)
                {
                    diss[v]=diss[u]+w;
                    if(!used[v])
                    {
                        p.first=diss[v];
                        p.second=v;
                        q.push(p);
                    }
                }
            }
        }
    }
    memset(used,0,sizeof(used));
    P p;
    p.first=0,p.second=1;
    q.push(p);
    while(!q.empty())
    {
        ll u=q.top().second;
        q.pop();
        used[u]=1;
        for(ll i=head[u];i;i=next[i])
        {
            if(i&1) continue;
            ll v=to[i],w=edge[i];
            if(dist[v]>dist[u]+w)
            {
                dist[v]=dist[u]+w;
                if(!used[v])
                {
                    p.first=dist[v];
                    p.second=v;
                    q.push(p);
                }
            }
        }
    }
    for(ll i=2;i<=n;i++)
        ans+=diss[i]+dist[i];
}
int main()
{
    ll t;
    scanf("%lld",&t);
    while(t--)
    {
        memset(head,0,sizeof(head));
        cnt=1;ans=0;
        ll u,v,w;
        scanf("%lld%lld",&n,&m);
        for(ll i=1;i<=m;i++)
        {
            scanf("%lld%lld%lld",&u,&v,&w);
            add(u,v,w);
        }
        disj();
        printf("%lld\n",ans);
    }
}


2018.6.29

posted @ 2018-06-29 16:04  露迭月  阅读(154)  评论(0编辑  收藏  举报