列表

详情


NC14352. 旅行

描述

小z放假了,准备到RRR城市旅行,其中这个城市有N个旅游景点。小z时间有限,只能在三个旅行景点进行游玩。小明租了辆车,司机很善良,说咱不计路程,只要你一次性缴费足够,我就带你走遍RRR城。
小z很开心,直接就把钱一次性缴足了。然而小z心机很重,他想选择的路程尽量长。
然而司机也很聪明,他每次从一个点走到另外一个点的时候都走最短路径。
你能帮帮小z吗?
需要保证这三个旅行景点一个作为起点,一个作为中转点一个作为终点。(一共三个景点,并且需要保证这三个景点不能重复).

输入描述

本题包含多组输入,第一行输入一个整数t,表示测试数据的组数
每组测试数据第一行输入两个数N,M表示RRR城一共有的旅游景点的数量,以及RRR城中有的路的数量。
接下来M行,每行三个数,a,b,c表示从a景点和b景点之间有一条长为c的路
t<=40
3<=N,M<=1000
1<=a,b<=N
1<=c<=100

输出描述


每组数据包含一行,输出一个数,表示整条路程的路长。
如果找不到可行解,输出-1.

示例1

输入:

4
7 7
1 2 100
2 3 100
1 4 4
4 5 6
5 6 10
1 6 4
6 7 8
7 3
1 2 1
1 3 1
1 3 2
7 3
1 2 1
3 4 1
5 6 1
8 9
1 2 1
2 3 1
3 4 1
4 1 1
4 5 1
5 6 1
6 7 1
7 8 1
8 5 1

输出:

422
3
-1
9

说明:

请注意这是一个稀疏图.

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 445ms, 内存消耗: 668K, 提交时间: 2022-11-30 16:11:39

#include<iostream>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
typedef pair<int ,int > PII;
const int N=2010;
int dis[N];
bool vis[N];
int n,m;
vector<PII> g[N];
int solve(int s){
	priority_queue<PII ,vector<PII>,greater<PII> > q;
	memset(vis,false,sizeof vis);
	memset(dis,0x3f,sizeof dis);
	q.push({0,s});
	dis[s]=0;
	int ans1=0,ans2=0;
	while(q.size()){
		int u=q.top().second;
		q.pop();
		if(vis[u])continue;
		vis[u]=true;
		ans2=max(ans2,dis[u]);
		if(ans2>ans1)swap(ans1,ans2);
		for(int i=0;i<g[u].size();i++){
			int x=g[u][i].first,y=g[u][i].second;
			if(dis[x]>dis[u]+y){
				dis[x]=dis[u]+y;
				q.push({dis[x],x});
			}
		}
	} 
	if(ans2==0)return 0;
	return (ans1+ans2);
}
int main()
{
	int t;
	cin>>t;
	while(t--){
		cin>>n>>m;
		for(int i=1;i<=n;i++)g[i].clear();
		for(int i=1;i<=m;i++){
			int u,v,w;
			cin>>u>>v>>w;
			g[u].push_back({v,w});
			g[v].push_back({u,w});
		}
		int ans=0;
		for(int i=1;i<=n;i++){
			ans=max(ans,solve(i));
		}
		if(ans)cout<<ans<<endl;
		else cout<<-1<<endl;
	}
	return 0;
}

C++ 解法, 执行用时: 475ms, 内存消耗: 556K, 提交时间: 2022-03-15 19:24:26

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=1010;
int n,m;
int dis[N],vis[N];
vector<PII> G[N];
int ans;
int dij(int s){
	priority_queue<PII,vector<PII>,greater<PII> > q;
	memset(vis,0,sizeof vis);
	memset(dis,0x3f,sizeof dis);
	q.push({0,s});
	dis[s]=0;
	int res1=0,res2=0;
	while(q.size()){
		int u=q.top().second;q.pop();
		if(vis[u])continue;
		vis[u]=1;
		res2=max(res2,dis[u]);
		if(res2>res1)swap(res2,res1);
		for(int i=0;i<G[u].size();i++){
			int v=G[u][i].first,d=G[u][i].second;
			if(dis[v]>dis[u]+d){
				dis[v]=dis[u]+d;
				q.push({dis[v],v});
			}
		}
	}
	if(res2==0) return 0;
	return (res1+res2);
}

int main(){
	int T;
	cin>>T;
	while(T--){
		for(int i=1;i<=n;i++)G[i].clear();
		cin>>n>>m;
		ans=-1;
		for(int i=1;i<=m;i++){
			int u,v,w;
			cin>>u>>v>>w;
			G[u].push_back({v,w});
			G[v].push_back({u,w});
		}
		for(int i=1;i<=n;i++){
			ans=max(ans,dij(i));
		}
		if(ans==0)ans=-1;
		cout<<ans<<endl;
	}
}

上一题