vijos-1547,逆转,然后再见

mac2024-06-20  60

题目描述:

上届的高三在这个暑假终于要到各个城市奔向他们的大学生活了。奇怪的是学校这次异 常阔气,说要用三台车子去载他们上学。上届高三的师兄们异常兴奋……可惜的是临行的时 候,学校终于露出它“狰狞”的面孔: 一、油费要学生自己给 二、去第k 个城市的条件是,前k-1 个城市都要被去过 三、同时只能有一部车子在动 师兄们也只能不断地锤胸口…… 但是改乘飞机已经来不及了…… 他们只好利用电脑组的优势去编一个最短路径以减少自己付的油费。

(P.S.没有人喜欢走回头路……)

 

输入: 

第一行一个数N,代表一共要去多少个城市。

下面N-1 行,对于第 i 行,有 n-i 个数,表示第 i 个城市分别和第i+1, i+2, i+3, ……, N 的距离

 输出:

一行,最短的路程 

样例输入: 

5

1 1 1 2

33 33 33

33 33

33 

样例输出: 

36 

程序代码: 

#include<iostream> #include<cstdio> #include<algorithm> #define INF 0x3f3f3f #define N 101 using namespace std; int n,ans,f[N][N]; void dfs(int city,int a,int b,int c,int dis) { if(dis>ans)//大于最短路程直接返回 return ; if(city==n)//城市数量等于n { ans=min(ans,dis);//取最小路程 return ; } dfs(city+1,city+1,b,c,dis+f[a][city+1]);//城市数量依次加一,第一个为城市a,接着为城市b,最后是城市c dfs(city+1,a,city+1,c,dis+f[b][city+1]); dfs(city+1,a,b,city+1,dis+f[c][city+1]); } int main() { scanf("%d",&n); for(int i=1;i<=100;i++) for(int j=1;j<=100;j++) f[i][j]=INF; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) scanf("%d",&f[i][j]); ans=INF; dfs(1,1,1,1,0); printf("%d\n",ans); return 0; }

 

最新回复(0)