zoukankan      html  css  js  c++  java
  • 最短路径问题

     

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:5480

    解决:1757

    题目描述:
    给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
    输入:
    输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
    (1<n<=1000, 0<m<100000, s != t)
    输出:
    输出 一行有两个数, 最短距离及其花费。
    来源:
    2010年浙江大学计算机及软件工程研究生机试真题



     
     1 #include <iostream>
     2 using namespace std;
     3 int INF=99999999;
     4  
     5 struct lnode{
     6         int data;
     7         int cost;
     8 };
     9  
    10 lnode mx[1001][1001];
    11  
    12 int main()
    13 {
    14         int i,j;
    15         int n,m,a,b,dd,p,s,t;
    16         int v[1001],d[1001],c[1001];//v 是否访问过  d【i】 起点开始到i的最短距离   c【i】  花费
    17  
    18  
    19         while(cin>>n)
    20         {
    21    cin>>m;
    22                 if(n==0 && m==0) break;
    23                 for(i=1;i<=n;++i)
    24                         for(j=1;j<=n;++j)
    25                                 mx[i][j].data=mx[i][j].cost=INF;
    26                 for(i=0;i<m;++i)
    27                 {
    28                       cin>>a>>b>>dd>>p;
    29                       mx[a][b].data=mx[b][a].data=dd;
    30                       mx[a][b].cost=mx[b][a].cost=p;
    31                     
    32                 }
    33                 cin>>s>>t;
    34  
    35                 for(i=1;i<=n;++i) v[i]=0;
    36                 
    37  
    38                 for(i=1;i<=n;++i)
    39                         c[i]=d[i]=(i==s?0:INF);//从s开始
    40  
    41  
    42                 for(i=0;i<n;++i)
    43                 {
    44                         int x,m=INF;//选点
    45                         for(j=1;j<=n;++j)
    46                            if(!v[j] && d[j]<m)  
    47 {
    48   m=d[j];
    49        x=j;
    50   }
    51                       
    52   v[x]=1;//入点
    53  
    54  
    55                         for(j=1;j<=n;j++)//更新
    56                         {
    57                                         if(d[j]>=d[x]+mx[x][j].data)
    58                                         {
    59                                                 d[j]=d[x]+mx[x][j].data;
    60                                                 if(c[j]>c[x]+mx[x][j].cost)  
    61 c[j]=c[x]+mx[x][j].cost;
    62                                         }
    63                         }
    64                 }
    65                cout<<d[t]<<" "<<c[t]<<endl;
    66         }
    67         return 0;
    68 }
  • 相关阅读:
    发现了一个前端导航网站
    git 设置区分大小写
    分享一个 thinkphp 分页的24款样式
    thinkphp5结合layui表单和图片上传
    tp5分页+循环子字段
    tp5 + layui 分页
    composer的安装
    thinkphp 管道写法及volist标签属性
    把常见的分隔符按照自定义的格式分割
    spring mvc 框架下的maven打包发布方法
  • 原文地址:https://www.cnblogs.com/xiaoyesoso/p/4265125.html
Copyright © 2011-2022 走看看