资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
逗志芃是有妹子的现充,但是有时候妹子就是烦恼。因为逗志芃太逗了,所以这段时间妹子对逗志芃发动了技能无理取闹,妹子要去玩很多的景点。由于逗志芃之前抽机花费了太多的时间,不久以后又要微积分考试了,所以现在被妹子搞成暴走状态了。但是妹子永远是上帝,所以逗志芃只能带妹子出去玩,不过为了节约时间,他希望找到一条花费时间最少的一次性游览线路。
输入格式
第一行1个数n,表示逗志芃所在的城市有多少个景点,接下来是一个n*n的矩阵。a(i,j)表示i号景点到j号景点的路上花费的时间是多少。
接下来是一个数m,表示逗志芃妹子要去去的景点数目。由于妹子在无理取闹,所以可能会有重复的景点,不过只要去一次就可以了。接下来是m个数,就是妹子要去的景点编号。
输出格式
一个数,最少的花费时间。
样例输入
3
0 1 2
1 0 3
2 3 0
3
2 3 1
样例输出
3
数据规模和约定
0<n<=30,0<m<=20,时间<=1000000
思路:
/*
1.先求出两点之间的最短距离
2.求出游览计划实际景点下标
3.深度遍历所有可能游览路线,求出最小值
*/
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=45;
int tim[N][N],vis[N];
int a[N];
int n,m,ans=INT_MAX,d=0;//d实际去重后,游览计划的景点数目
void minD(){
//求两点之间最短时间
for(int p=1;p<=n;p++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j){
tim[i][j]=min(tim[i][j],tim[i][p]+tim[p][j]);//
}
}
}
}
}
//深度遍历求游览计划的最短时间
void dfs(int pos,int ct,int sum){
if(ct>=d){
ans=min(ans,sum);
return;
}
for(int i=1;i<=n;i++){
if(a[i]&&!vis[i]&&sum<ans){
vis[i]=true;
dfs(i,ct+1,sum+tim[pos][i]);
vis[i]=false;
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>tim[i][j];
minD();//
cin>>m;
for(int i=0;i<m;i++){
int x;
cin>>x;
if(a[x]==0)d++;
a[x]=1;
}
for(int i=1;i<=n;i++){
if(a[i]){//游览计划有
vis[i]=true;
dfs(i,1,0);
vis[i]=false;
}
}
cout<<ans;
}
觉得不错点个赞吧,让我知道你的赞赏!