洛谷---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;
}
相关推荐
PixelMind8 分钟前
【LUT技术专题】基于扩展卷积的极快速LUT算法
算法
格林威19 分钟前
Baumer工业相机堡盟工业相机如何通过BGAPI SDK在Linux系统下设置多个USB相机(C++)
linux·c++·人工智能·数码相机·计算机视觉
末央&39 分钟前
【数据结构】手撕二叉搜索树
开发语言·数据结构·c++
SeasonedDriverDG1 小时前
GEC6818蜂鸣器驱动开发
算法
珹洺1 小时前
C++从入门到实战(十二)详细讲解C++如何实现内存管理
c语言·开发语言·数据结构·c++
碳酸的唐1 小时前
用python实现鼠标监听与手势交互
python·动态规划·图论
悦悦子a啊1 小时前
第八章--图
数据结构·c++·算法
是垚不是土1 小时前
Go语言中的并发编程--详细讲解
java·运维·开发语言·算法·golang·运维开发
东方芷兰1 小时前
Leetcode 刷题记录 09 —— 链表第三弹
算法·leetcode·链表
yuhao__z1 小时前
代码随想录算法训练营第五十八天| 图论4—卡码网110. 字符串接龙,105. 有向图的完全联通
算法·图论