• 一本通1261:【例9.5】城市交通路网


    题目描述

    下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由(1)(->)(n)。试用动态规划的最优化原理求出(1)(->)(n)的最省费用

    (左图没有任何用处)

    如图:求v1到v10的最短路径长度及最短路径。

    输入

    第一行为城市的数量N;

    后面是N*N的表示两个城市间费用组成的矩阵。

    输出

    (1)(->)(n)的最省费用

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=100+5;
    int n,a[maxn][maxn],ans,s[maxn],path[maxn];//a[i][j]记录从i到j的距离,s[i]记录到点i是的最省费用,path[i]记录路径 
    inline void dfs(int i,int sum){//i是到了第i点,sum是当前的最省费用 
    	if(i==n){
    		ans=min(ans,sum);
    		return ;
    	}//如果到了点n,就取最省费用 
    	for(int j=i+1;j<=n;j++)//知道到编号比i大的点 
    		if(a[i][j]){
    			if(sum+a[i][j]<s[j]){//如果到j点时的费用比原本费用大,就不用往下dfs 
    				s[j]=sum+a[i][j];
    				path[j]=i;//记录路径 
    				dfs(j,s[j]);
    			}
    		}	
    }
    inline void out(int i){//倒序输出 
    	if(i==1){
    		printf("%d",i);
    		return ;	
    	}
    	out(path[i]);
    	printf(" %d",i);
    }
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			cin>>a[i][j];//输入 
    	ans=1e9;//因为取最小值,所以ans定最大 
    	for(int i=1;i<=n;i++)
    		s[i]=1e9;//同ans 
    	dfs(1,0);
    	printf("minlong=%d
    ",ans);
    	out(n);//输出 
    	return 0;
    }
    
  • 相关阅读:
    android getContext()
    android DB notify
    android 调用系统截图
    调用新浪微博客户端发送图片
    Hadoop 面试 小结
    HADOOP 安装HIVE
    ORACLE ArcSDE Lock request conflicts with an established lock
    OBIEEClusterControler通信的问题
    ORACLE RAC 集群的启动和关闭
    HADOOP 配置Tip 配置hadoop.tmp.dir
  • 原文地址:https://www.cnblogs.com/xzj213/p/11202221.html
Copyright © 2020-2023  润新知