[Luogu1342] 请柬 - 最短路模板
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] 请柬 - 最短路模板的更多相关文章
- POJ 2449Remmarguts' Date K短路模板 SPFA+A*
K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...
- poj1511/zoj2008 Invitation Cards(最短路模板题)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Invitation Cards Time Limit: 5 Seconds ...
- k短路模板 POJ2449
采用A*算法的k短路模板 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- HDU 5521.Meeting 最短路模板题
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven(第k短路模板)
求第k短路模板 先逆向求每个点到终点的距离,再用dij算法,不会超时(虽然还没搞明白为啥... #include<iostream> #include<cstdio> #inc ...
- [poj2449]Remmarguts' Date(K短路模板题,A*算法)
解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #includ ...
- 51nod_1445 变色DNA 最短路模板 奇妙思维
这是一道最短路模板题,但是在理解题意和提出模型的阶段比较考验思维,很容易想到并且深深进入暴力拆解题目的无底洞当中. 题意是说:给出一个邻接矩阵,在每个点时,走且仅走向,合法路径中编号最小的点.问题是是 ...
- poj 2499第K短路模板
第k*短路模板(单项边) #include <iostream> #include <cstdio> #include <algorithm> #include & ...
- 牛客小白月赛6 I 公交线路 最短路 模板题
链接:https://www.nowcoder.com/acm/contest/136/I来源:牛客网 题目描述 P市有n个公交站,之间连接着m条道路.P市计划新开设一条公交线路,该线路从城市的东站( ...
随机推荐
- css多浏览常见问题
关于CSS对各个浏览器兼容已经是老生常谈的问题了, 网络上的教程遍地都是.以下内容没有太多新颖, 纯属个人总结, 希望能对初学者有一定的帮助. 一.CSS HACK 以下两种方法几乎能解决现今所有HA ...
- Python 基础语法复习
由于选修了<人工智能模式识别>的课程,要求用phthon来实现算法,乘着周三晚上没课,就来回顾一下python的主要语法. 环境: Anaconda Python3.6 1.变量 ...
- delphi XE Datasnap SERVER 在windows 7 下为服务添加描述信息
网上对服务添加描述信息的,多数是用注册表的方式,而注册表的方式,我在win7 下测试,不知为什么,总是不行,把执行的CMD以管理员模式开启,还是没加进去. 于是在网上查到下面的代码,保存供叁考,原文博 ...
- 提高UI设计效率的4个技巧
提高UI设计效率的4个技巧 如何提高UI设计的速度?在这里分享一些我观察到的常见问题和改善方式.当然,需要注意的地方何其多. 身为设计师的你,应该要了解工程实作的基本原理: 业界 NG 率:接近 10 ...
- Redis+Restful 构造序列号和压力测试【原创】
[本人原创],欢迎交流和分享技术,转载请附上如下内容:如果你觉得这篇文章对你有帮助,请记得帮我点赞, 谢谢!作者:kevin[转自]http://www.cnblogs.com/itshare/ 很多 ...
- Java中删除第一个集合中以某某开头的元素,删除第二个集合中以某某结尾的元素,并合并成一个集合
import java.util.ArrayList; import java.util.List; public class Test { public static void main(Strin ...
- 【Python】 文件和操作文件方法
文件 ■ 基本的文件用法 f = open("path","mode") mode有a,w,r,b,+等.默认为r.模式与打开文件时的动作有关系,比如用w打开的 ...
- 解决Oracle登录时出现无法处理服务名问题
1.首先找到客户端的tnsnames.ora文件,打开看看里面有没有配置相应的服务器名,服务器名就是你的数据库名: 2.如果有相应的服务器名,那就检查一下配置信息是否错误,如果没有就添加: 3.配置信 ...
- wps中如何插入参考文献
最近学校论文规定要将参考文献在正文中引用,所以自己对这一方面做一下总结:点击插入尾注, 1:打开你的论文 2:点击"引用"--"插入尾注" 3:你会发现出现的不 ...
- Entity Framework——并发策略
使用EF框架遇到并发时,一般采取乐观并发控制. 1支持并发检验 为支持并发检验,需要对实体进行额外的设置.默认情况下是不支持并发检验的.有以下两种方式: 方式名称 说明 时间戳注解/行版本 使用Tim ...