洛谷---P1629 邮递员送信

题目描述

有一个邮递员要送东西,邮局在节点 1。他总共要送 n−1 样东西,其目的地分别是节点 2 到节点 n。由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有 m 条道路。这个邮递员每次只能带一样东西,并且运送每件物品过后必须返回邮局 。求送完这 n−1 样东西并且最终回到邮局最少需要的时间。

输入格式

第一行包括两个整数,n 和 m,表示城市的节点数量和道路数量。

第二行到第 (m+1) 行,每行三个整数,u,v,w,表示从 u 到 v 有一条通过时间为 w 的道路。

输出格式

输出仅一行,包含一个整数,为最少需要的时间。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;
const int N=1010;
int n,m;
int dis[N*2];
void dij(vector<vector<pii>> &g,int start){
	priority_queue<pii,vector<pii>,greater<pii>> q;
	dis[start]=0;
	q.push({dis[start],start});
	while(!q.empty()){
		int u=q.top().second;
		int d=q.top().first;
		q.pop();
		if(d>dis[u]) continue;
		for(auto & x:g[u]){
			int v=x.first,w=x.second;
			if(dis[u]+w<dis[v]){
				dis[v]=dis[u]+w;
				q.push({dis[v],v});
				//cout<<"??1";
			}
		}
	}
}
int main(){
	cin>>n>>m;
	vector<vector<pii>> gra(2*n+1);
	for(int i=1;i<=m;++i){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		gra[a].push_back({b,c});
		gra[b+n].push_back({a+n,c});
	}
	int ans=0;
	for(int i=1;i<=2*n;++i) dis[i]=INF;
	dij(gra,1);
	for(int i=2;i<=n;++i){
		ans+=dis[i];
		//cout<<dis[i]<<" ";
	} 
	dij(gra,1+n);
	for(int i=n+2;i<=n<<1;++i) ans+=dis[i];
	cout<<ans<<endl;
	return 0;
}
相关推荐
Mingze03148 分钟前
考研408之栈与队列学习
开发语言·c++·学习·考研·算法
青草地溪水旁12 分钟前
第五章:原型模式 - 克隆大法的大师
c++·设计模式·原型模式
艾醒21 分钟前
探索大语言模型(LLM):大模型微调方式全解析
人工智能·算法
从前慢,现在也慢26 分钟前
【STL学习】(9)priority_queue
c++·学习
序属秋秋秋28 分钟前
《C++进阶之C++11》【智能指针】(上)
c++·笔记·学习·面试·c++11·智能指针·新特性
guigu201235 分钟前
C++ STL 深度解析:容器、迭代器与算法的协同作战
c++·嵌入式编程
Yupureki43 分钟前
从零开始的C++学习生活 3:类和对象(中)
c语言·c++·学习·visual studio
小许学java2 小时前
七大排序算法的基本原理
数据结构·算法·排序算法
凤年徐2 小时前
【C++】string类
c语言·开发语言·c++
艾醒2 小时前
大模型面试题剖析:深入解析 Transformer 与 MoE 架构
人工智能·算法