洛谷---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;
}
相关推荐
IT199514 小时前
OpenSSL3.5.2实现SM3数据摘要生成
算法·哈希算法·散列表
Excuse_lighttime14 小时前
排序数组(快速排序算法)
java·数据结构·算法·leetcode·eclipse·排序算法
潘小安15 小时前
『译』迄今为止最强的 RAG 技术?Anthropic 的上下文检索与混合搜索
算法·llm·claude
kessy115 小时前
安全与续航兼备的“国密芯”——LKT6810U
算法
leo__52015 小时前
基于经验模态分解的去趋势波动分析(EMD-DFA)方法
人工智能·算法·机器学习
lzptouch15 小时前
AdaBoost(Adaptive Boosting)算法
算法·集成学习·boosting
南方的狮子先生16 小时前
【数据结构】(C++数据结构)查找算法与排序算法详解
数据结构·c++·学习·算法·排序算法·1024程序员节
紫荆鱼16 小时前
设计模式-适配器模式(Adapter)
c++·设计模式·适配器模式
前进的李工16 小时前
LeetCode hot100:560 和为k的子数组:快速统计法
python·算法·leetcode·前缀和·哈希表
在等晚安么17 小时前
力扣面试经典150题打卡
java·数据结构·算法·leetcode·面试·贪心算法