P1342 请柬

Posted alex-leaves

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1342 请柬相关的知识,希望对你有一定的参考价值。

题目描述

在电视时代,没有多少人观看戏剧表演。Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片。他们已经打印请帖和所有必要的信息和计划。许多学生被雇来分发这些请柬。每个学生志愿者被指定一个确切的公共汽车站,他或她将留在那里一整天,邀请人们参与。

这里的公交系统是非常特殊的:所有的线路都是单向的,连接两个站点。公共汽车离开起始点,到达目的地之后又空车返回起始点。学生每天早上从总部出发,乘公交车到一个预定的站点邀请乘客。每个站点都被安排了一名学生。在一天结束的时候,所有的学生都回到总部。现在需要知道的是,学生所需的公交费用的总和最小是多少。

输入输出格式

输入格式:

第1行有两个整数n、m(1<=n,m<=1000000),n是站点的个数,m是线路的个数。

然后有m行,每行描述一个线路,包括3个整数,起始点,目的地和价格。

总部在第1个站点,价钱都是整数,且小于1000000000。

 

输出格式:

输出一行,表示最小费用。

 

输入输出样例

输入样例#1: 复制
4 6
1 2 10
2 1 60
1 3 20
3 4 10
2 4 5
4 1 50
输出样例#1: 复制
210 

说明

【注意】

此题数据规模较大,需要使用较为高效的算法,此题不设小规模数据分数。

 

基本模板题,spfa,正图(positive)和反图(negative)各搜一遍。

注意ans用long long。

AC代码如下:

#include<cstdio>
#include<algorithm>
#include<deque>
using namespace std;
const int N=1000000+5;
const int INF=1<<30;
struct p{
    int v,nxt,cost;
}po[N],neg[N];
int dis[N],po_fir[N],neg_fir[N],x,y,z,n,m,tot;
bool inq[N];
long long ans;
deque<int>q;
void add(int from,int to,int l)
{
    tot++;
    po[tot]=(p){to,po_fir[from],l};
    neg[tot]=(p){from,neg_fir[to],l};
    po_fir[from]=tot;
    neg_fir[to]=tot;
    return;
}
void po_spfa()
{
    q.push_back(1);
    fill(dis+2,dis+n+1,INF);
    dis[1]=0;
    while(!q.empty())
    {
        int now=q.front();
        q.pop_front();
        inq[now]=0;
        for(int i=po_fir[now];i;i=po[i].nxt)
        if(dis[po[i].v]>dis[now]+po[i].cost)
        {
            dis[po[i].v]=dis[now]+po[i].cost;
            if(!inq[po[i].v])
            {
                inq[po[i].v]=1;
                if(q.empty()||dis[q.front()]>dis[po[i].v]) q.push_front(po[i].v);
                else q.push_back(po[i].v);
            }
         } 
    }
    for(int i=2;i<=n;i++)
    ans+=dis[i];
    return;
}
void neg_spfa()
{
    q.push_back(1);
    dis[1]=0;
    fill(dis+2,dis+n+1,INF);
    while(!q.empty())
    {
        int now=q.front();
        q.pop_front();
        inq[now]=0;
        for(int i=neg_fir[now];i;i=neg[i].nxt)
        if(dis[neg[i].v]>dis[now]+neg[i].cost)
        {
            dis[neg[i].v]=dis[now]+neg[i].cost;
            if(!inq[neg[i].v])
            {
                inq[neg[i].v]=1;
                if(q.empty()||dis[q.front()]>dis[neg[i].v]) q.push_front(neg[i].v);
                else q.push_back(neg[i].v);
            }
         } 
    }
    for(int i=2;i<=n;i++)
    ans+=dis[i];
    return;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    scanf("%d%d%d",&x,&y,&z),add(x,y,z);
    po_spfa();
    neg_spfa();
    printf("%lld",ans);
    return 0;
}

 

以上是关于P1342 请柬的主要内容,如果未能解决你的问题,请参考以下文章

洛谷—— P1342 请柬

P1342 请柬

P1342 请柬

洛谷 P1342 请柬

LUOGU P1342 请柬

[洛谷P1342]请柬