新年好(c++题解)

题目描述

原题来自:CQOI 2005

重庆城里有  个车站, 条双向公路连接其中的某些车站。每两个车站最多用一条公路连接,从任何一个车站出发都可以经过一条或者多条公路到达其他车站,但不同的路径需要花费的时间可能不同。在一条路径上花费的时间等于路径上所有公路需要的时间之和。

佳佳的家在车站 ,他有五个亲戚,分别住在车站 。过年了,他需要从自己的家出发,拜访每个亲戚(顺序任意),给他们送去节日的祝福。怎样走,才需要最少的时间?

输入格式

第一行: 为车站数目和公路的数目。

第二行: 为五个亲戚所在车站编号。

以下  行,每行三个整数 ,为公路连接的两个车站编号和时间。

输出格式

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

样例

样例输入
复制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

_____________________________________________________________________________

写作不易,点个赞呗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

_____________________________________________________________________________

#include<bits/stdc++.h>
#define PII pair<int,int>
using namespace std;
int n,m,x,y,z,ans=INT_MAX;
vector<PII>a[1000005];
int dist[1000005];
int person[6];
int c[10005][10005];
bool b[6];
priority_queue<PII,vector<PII>,greater<PII> >Q;
void f(int q){
	memset(dist,0x3f3f3f3f,sizeof(dist));
	dist[q]=0;
	Q.push({0,q});
	while(!Q.empty()){
		auto t=Q.top();
		Q.pop();
		int vi=t.second;
		for(auto i:a[vi]){
			int v=i.second,w=i.first;
			if(dist[v]>dist[vi]+w){
				dist[v]=dist[vi]+w;
				Q.push({dist[v],v});
			}
		}
	}
}
void dfs(int h,int l,int L){
    if(h>=ans)return;
	if(L==0){
		ans=min(h,ans);
		return;
	}
	for(int i=1;i<=5;i++){
		if(b[i])continue;
		b[i]=true;
		dfs(h+c[l][i],i,L-1);
		b[i]=false;
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=5;i++)cin>>person[i];
	for(int i=1;i<=m;i++){
		scanf("%d %d %d",&x,&y,&z);
		a[x].push_back({z,y});
		a[y].push_back({z,x});
	}
	person[0]=1;
	for(int i=0;i<=5;i++){
		f(person[i]);
		for(int j=0;j<=5;j++){
			c[i][j]=dist[person[j]];
		}
	}
	dfs(0,0,5);
    cout<<ans; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值