洛谷---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;
}
相关推荐
deng-c-f5 小时前
Linux C/C++ 学习日记(49):线程池
c++·学习·线程池
ulias2125 小时前
C++ 的容器适配器——从stack/queue看
开发语言·c++
daidaidaiyu5 小时前
FFmpeg 关键的结构体
c++·ffmpeg
Tony_yitao5 小时前
15.华为OD机考 - 执行任务赚积分
数据结构·算法·华为od·algorithm
欧特克_Glodon6 小时前
C++医学图像处理经典ITK库用法详解<一>:图像输入输出模块功能
c++·图像处理·itk
C雨后彩虹6 小时前
任务总执行时长
java·数据结构·算法·华为·面试
风筝在晴天搁浅6 小时前
代码随想录 463.岛屿的周长
算法
一个不知名程序员www6 小时前
算法学习入门---priority_queue(C++)
c++·算法
TL滕7 小时前
从0开始学算法——第十八天(分治算法)
笔记·学习·算法