Description

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

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

Input&Output

Input

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

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

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

Output

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

Sample

Input

4 6
1 2 10
2 1 60
1 3 20
3 4 10
2 4 5
4 1 50

Output

210

Solution

本题是一道裸的最短路。需要特殊处理的问题在于,由于路线都是单向的,我们在求返程最短路时需要建一张反图。不得不说数据范围比较毒瘤,堆优化dijkstra可以稳定在O(nlogn),相较于O(玄学)的SPFA还是稳一些,另外建议读入优化。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cctype>
#include<cstring>
#define maxn 1000005
#define INF_ 214748000000
using namespace std;
typedef unsigned long long ull;
struct edge{
    int to,nxt,v;
}e[maxn],re[maxn];
int n,m,edgenum,redgenum,lnk[maxn],rlnk[maxn],u,v,w;
void add(int bgn,int end,int val)
{
    e[++edgenum].to=end;
    e[edgenum].v=val;
    e[edgenum].nxt=lnk[bgn];
    lnk[bgn]=edgenum;
}
void radd(int bgn,int end,int val)
{
    re[++redgenum].to=end;
    re[redgenum].v=val;
    re[redgenum].nxt=rlnk[bgn];
    rlnk[bgn]=redgenum;
}
inline int rd()
{
    int x=0;char c=getchar();
    while(!isdigit(c))c=getchar();
    while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x;
}
struct node{
    ull dis;
    int id;
    node(ull d,int i):dis(d),id(i){}
    bool operator < (const node &b)const{
        return dis>b.dis;
    }
};
ull dis[maxn];
bool vis[maxn];
void dij()
{
    for(int i=1;i<=n;++i)
        dis[i]=INF_;
    priority_queue<node> q;
    dis[1]=0;
    q.push(node(0,1));
    while(!q.empty()){
        node u=q.top();q.pop();
        if(vis[u.id])continue;
        vis[u.id]=true;
        for(int p=lnk[u.id];p;p=e[p].nxt){
            int y=e[p].to;
            if(dis[y]>dis[u.id]+e[p].v){
                dis[y]=dis[u.id]+e[p].v;
                q.push(node(dis[y],y));
            }
        }
    }
}
void rdij()
{
    for(int i=1;i<=n;++i)
        dis[i]=INF_;
    memset(vis,0,n+1);
    priority_queue<node> q;
    dis[1]=0;
    q.push(node(0,1));
    while(!q.empty()){
        node u=q.top();q.pop();
        if(vis[u.id])continue;
        vis[u.id]=true;
        for(int p=rlnk[u.id];p;p=re[p].nxt){
            int y=re[p].to;
            if(dis[y]>dis[u.id]+re[p].v){
                dis[y]=dis[u.id]+re[p].v;
                q.push(node(dis[y],y));
            }
        }
    }
}
int main()
{
    n=rd();m=rd();
    for(int i=1;i<=m;++i)
        u=rd(),v=rd(),w=rd(),add(u,v,w),radd(v,u,w);
    dij();
    ull sum=0;
    for(int i=2;i<=n;++i)
        sum+=dis[i];
    rdij();
    for(int i=2;i<=n;++i)
        sum+=dis[i];
    printf("%lld\n",sum);
    return 0;
}

[Luogu1342] 请柬 - 最短路模板的更多相关文章

  1. POJ 2449Remmarguts' Date K短路模板 SPFA+A*

    K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...

  2. poj1511/zoj2008 Invitation Cards(最短路模板题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Invitation Cards Time Limit: 5 Seconds    ...

  3. k短路模板 POJ2449

    采用A*算法的k短路模板 #include <iostream> #include <cstdio> #include <cstring> #include < ...

  4. HDU 5521.Meeting 最短路模板题

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  5. ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven(第k短路模板)

    求第k短路模板 先逆向求每个点到终点的距离,再用dij算法,不会超时(虽然还没搞明白为啥... #include<iostream> #include<cstdio> #inc ...

  6. [poj2449]Remmarguts' Date(K短路模板题,A*算法)

    解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #includ ...

  7. 51nod_1445 变色DNA 最短路模板 奇妙思维

    这是一道最短路模板题,但是在理解题意和提出模型的阶段比较考验思维,很容易想到并且深深进入暴力拆解题目的无底洞当中. 题意是说:给出一个邻接矩阵,在每个点时,走且仅走向,合法路径中编号最小的点.问题是是 ...

  8. poj 2499第K短路模板

    第k*短路模板(单项边) #include <iostream> #include <cstdio> #include <algorithm> #include & ...

  9. 牛客小白月赛6 I 公交线路 最短路 模板题

    链接:https://www.nowcoder.com/acm/contest/136/I来源:牛客网 题目描述 P市有n个公交站,之间连接着m条道路.P市计划新开设一条公交线路,该线路从城市的东站( ...

随机推荐

  1. python初识(二)

    伟大的"hello world" print("hello world") 第一个简单的python程序就搞定了 浅谈python语言的特点: 1. 语法简洁: ...

  2. IPFS:Filecoin和复制证明

    这篇文章主要来讲一下Filecoin协议里面的复制证明(Proof of Replication),由于协议涉及到很多概念,可能看起来有点晕乎乎的,小编尽量把复杂问题简单化 ,力求给大家做大普及IPF ...

  3. 打印二叉堆(Java实现)

    打印二叉堆:利用层级关系 我这里是先将堆排序,然后在sort里执行了打印堆的方法printAsTree() public class MaxHeap<T extends Comparable&l ...

  4. Day3---------网络基础和DOS命令

    一.网络分类 1.地理位置 1).局域网(LAN) 2).城域网(MAN) 3).广域网(WAN) 2.传输介质 1).有线网 2).光纤网 3).无线网 3.层--------设备 传输层----- ...

  5. JAVA代码提示

    经过以上过程,整个项目需要的环境差不多搭建完成了.接下来一个小技巧,如下图进行配置之后就可以将只在.出现时进行代码提示换成任意字母+.出现时的代码提示了(.abcdefghijklmnopqrstuv ...

  6. mysql新手入门随笔2

    17.创建表 CREATE TABLE tbname(columnname1 类型 约束条件, columnname2 类型 约束条件,-); 三大类型:数值型,时间日期型,字符串类型 六大约束条件: ...

  7. VS2013创建Windows服务 || VS2015+Windows服务简易教程

    转自:https://www.cnblogs.com/no27/p/4849123.htmlhttps://blog.csdn.net/ly416/article/details/78860522 V ...

  8. .NET Core初体验 在window上构建第一个app

    ASP.NET Core 是一个跨平台,高性能的开源框架,用于构建现代化的,基于云的互联网应用程序.使用 ASP.NET Core ,您可以: 构建Web应用程序和服务,IoT应用程序和移动后端. 在 ...

  9. React Native 轻松集成统计功能(iOS 篇)

    最近产品让我加上数据统计功能,刚好极光官方支持数据统计 支持了 React Native 版本 第一步 安装: 在你的项目路径下执行命令: npm install janalytics-react-n ...

  10. C语言助教批改

    作业批改 每次作业批改后写一篇作业点评,助教轮流写作业总结.(总结分工老师安排). 每个助教点评自己负责的同学博客,点评要详细,不能只有一句话. 有比较优秀博客请或典型问题推荐到qq群,并发给写总结助 ...