城市交通网络

某dp题

#include<iostream>  
#include<cstring>  
#define MAXN 100  
using namespace std;  
int a[MAXN+5][MAXN+5];//a[i][x]表示vi到vx的最短距离   
int f[MAXN+5];//f[i]表示点vi到v10的最短距离   
int suf[MAXN+5];//suf[i]=x;表示i的后缀节点为x   
int main()  
{  
    memset(a,0,sizeof(a));  
    memset(suf,0,sizeof(f));   
    int i,x,n;  
    cin>>n;  
    for(int i=1;i<=n;i++)  
    {  
        for(int x=1;x<=n;x++)  
        {  
            cin>>a[i][x];  
        }  
        f[i]=100000;  
    }   
    f[n]=0;  
    for(int i=n-1;i>=1;i--)  
    {  
        for(int x=i+1;x<=n;x++)  
        {  
            if((a[i][x]>0)&&(f[x]!=100000)&&(f[i]>a[i][x]+f[x]))  
            //如果vi到vx之间有路径,vx到v10有路径,并且vi直接到v10的路径大于通过vx中转的路径   
            {  
                f[i]=a[i][x]+f[x];  
                suf[i]=x;//i节点的后缀节点为x   
            }  
        }  
    }  
    x=1;  
    cout<<"minlong="<<f[1]<<endl;  
    while(x!=0)//模拟循环链表   
    {  
        cout<<x<<" ";  
        x=suf[x];  
    }  
    cout<<endl;  
    return 0;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值