司马懿把我的100改判成了TLE 0分,(站外题,玄2关)
  • 板块灌水区
  • 楼主yangkaiyi
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/7 10:08
  • 上次更新2024/8/7 11:06:53
查看原帖
司马懿把我的100改判成了TLE 0分,(站外题,玄2关)
1226849
yangkaiyi楼主2024/8/7 10:08

重庆城里有 n 个车站,m 条双向公路连接其中的某些车站。每两个车站最多用一条公路连接,从任何一个车站出发都可以经过一条或者多条公路到达其他车站,但不同的路径需要花费的时间可能不同。在一条路径上花费的时间等于路径上所有公路需要的时间之和。 佳佳的家在车站 1,他有五个亲戚,分别住在车站 a,b,c,d,e。过年了,他需要从自己的家出发,拜访每个亲戚(顺序任意),给他们送去节日的祝福。怎样走,才需要最少的时间?

输入 第一行:n,m 为车站数目和公路的数目。 第二行:a,b,c,d,e 为五个亲戚所在车站编号。 以下 m 行,每行三个整数 x,y,t,为公路连接的两个车站编号和时间。

输出 输出仅一行,包含一个整数 T,为最少的总时间。

样例输入 复制 6 6 2 3 4 5 6 1 2 8 2 3 3 3 4 4 4 5 5 5 6 2 1 6 7 样例输出 复制 21 提示 数据范围: 对于全部数据,1≤n≤50000,1≤m≤10^5,1<a,b,c,d,e≤n,1≤x,y≤n,1≤t≤100。

哦,对了,代码忘记上了:

#include<bits/stdc++.h>
#pragma G++ optimize("O2")
#define int long long
using namespace std;
int n,m,i,x,y,z,d[6][50010],c[50010],a[6],v[50010],ans,mi=2e9;
vector<int>f[50010],g[50010];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
void spfa(int s,int d[]){
	int i,fx,fb,sx,sb;memset(v,0,sizeof(v));for(i=1;i<=n;i++)d[i]=2e9;
	q.push(make_pair(0,s));v[s]=1;d[s]=0;
	while(!q.empty()){
		fx=q.top().second;fb=d[fx];v[fx]=0;q.pop();
		for(i=0;i<f[fx].size();i++){
			sx=f[fx][i];sb=fb+g[fx][i];
			if(sb<d[sx]){
				d[sx]=sb;
				if(v[sx]==0)q.push(make_pair(sb,sx)),v[sx]=1;
			}
		}
	}
}
main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	cin>>n>>m;c[0]=1;
	for(i=1;i<=5;i++)cin>>c[i],a[i]=i;
	for(i=1;i<=m;i++)cin>>x>>y>>z,f[x].push_back(y),f[y].push_back(x),g[x].push_back(z),g[y].push_back(z);
	for(i=0;i<=5;i++)spfa(c[i],d[i]);
	do{
		ans=0;
		for(i=0;i<5;i++)ans+=d[a[i]][c[a[i+1]]];
		mi=min(mi,ans);
	}while(next_permutation(a+1,a+1+n));
	cout<<mi;
}
2024/8/7 10:08
加载中...