思路:读错题。。比赛的时候没出来。。首先对每个点求一次最短路,然后枚举中间点,排序取前两个大的更新答案就可以了


#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
#define inf 1e9
vector<pair<int,int> >e[maxn];
int d[maxn][maxn];
int vis[maxn];
int res[maxn*2];
int n,m;
void spfa(int id)
{
    for(int i = 0;i<=n;i++)
		d[id][i]=inf;
    d[id][id]=0;
	queue<int>q;
	q.push(id);
	vis[id]=1;
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		vis[u]=0;
		for(int i = 0;i<e[u].size();i++)
		{
            int v = e[u][i].first;
			int w = e[u][i].second;
			if(d[id][v]>d[id][u]+w)
			{
				d[id][v]=d[id][u]+w;
				if(!vis[v])
				{  
				   q.push(v);
				   vis[v]=1;
				}
			}
		}
	}
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&m);
		for(int i = 0;i<=n;i++)e[i].clear();
		for(int i = 1;i<=m;i++)
		{
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			e[u].push_back(make_pair(v,w));
			e[v].push_back(make_pair(u,w));
		}
		for(int i = 1;i<=n;i++)
			spfa(i);
		int ans = -1;
		for(int i = 1;i<=n;i++)
		{
			int cnt = 0;
			for(int j = 1;j<=n;j++)
			{
				if(i==j)continue;
				if(d[i][j]!=inf)
                  res[cnt++]=d[i][j];
			}
			if(cnt<=1)continue;
			sort(res,res+cnt);
            ans = max(ans,res[cnt-1]+res[cnt-2]);
		}
		printf("%d\n",ans);
	}
}

Problem I: 旅行

Time Limit: 3 Sec  Memory Limit: 32 MB

Submit: 58  Solved: 16

[Submit][Status][Web Board]

Description

小z放假了,准备到RRR城市旅行,其中这个城市有N个旅游景点。小z时间有限,只能在三个旅行景点进行游玩。小明租了辆车,司机很善良,说咱不计路程,只要你一次性缴费足够,我就带你走遍RRR城。

小z很开心,直接就把钱一次性缴足了。然而小z心机很重,他想选择的路程尽量长。

然而司机也很聪明,他每次从一个点走到另外一个点的时候都走最短路径。

你能帮帮小z吗?

需要保证这三个旅行景点一个作为起点,一个作为中转点一个作为终点。(一共三个景点,并且需要保证这三个景点不能重复).

Input

本题包含多组输入,第一行输入一个整数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

Output

每组数据输出两行,

每组数据包含一行,输出一个数,表示整条路程的路长。

如果找不到可行解,输出-1.

Sample Input

47 71 2 1002 3 1001 4 44 5 65 6 101 6 46 7 87 31 2 11 3 11 3 27 31 2 13 4 15 6 18 91 2 12 3 13 4 14 1 14 5 15 6 16 7 17 8 18 5 1

Sample Output

4223-19

HINT

请注意这是一个稀疏图.