最短路径问题分数: 3.5

时间限制:1 秒
内存限制:32 兆
特殊判题: 否
提交:62
解决: 28

标签

  • 最短路径

题目描述

给你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)

输出

输出 一行有两个数, 最短距离及其花费。

样例输入

3 2
1 2 5 6
2 3 4 5
1 3
0 0

样例输出

9 11

提示[+]

*** 提示已隐藏,点击上方 [+] 可显示 ***

分类

  • 浙江大学研究生复试上机真题
  •  
  •  
  •  
  •  
  • max min 在OJ  c++都是保留字 函数名,在6.0里面可以编译通过,但是OJ上就不行!!!
  •  
  •  1 #include<iostream>
     2 #include<string>
     3 using namespace std;
     4 const int inf=10000000; 
     5 struct graph  //节点
     6 {
     7    int len;
     8    int cost;
     9 }g[1001][1001],min1[1001];//g为图的连接矩阵,min存起点到个个点的最短距离和最少花费
    10 void dijkstr(int n,int s)//n 节点个数 ,s起点编号
    11 {
    12 //初始化
    13     int v[1001]={0};//v[i]=0 表示还没并入路径中;
    14      for(int j=1;j<=n;j++)
    15  {
    16     min1[j].len=inf;
    17 min1[j].cost=inf;
    18  }
    19      min1[s].len=0;
    20  min1[s].cost=0;
    21  for(int x=1;x<=n;x++)
    22  {
    23          int MIN=inf;//最小路长
    24  int pri=inf;//最小费用
    25  int u;
    26      for(int y=1;y<=n;y++)//选最小的节点并入
    27  {
    28     if(v[y]==0&&((MIN>min1[y].len)||(MIN==min1[y].len&&pri>min1[y].cost)))
    29 {
    30    u=y;
    31    MIN=min1[y].len;
    32    pri=min1[y].cost;
    33 }
    34  }
    35  v[u]=1;  
    36  for(int z=1;z<=n;z++)  //更新u并入后的个个min的值
    37  {
    38     if(v[z]==0&&((min1[u].len+g[u][z].len<min1[z].len)||((min1[u].len+g[u][z].len==min1[z].len)&&(min1[u].cost+g[u][z].cost<min1[z].cost))))
    39 {
    40   min1[z].len=min1[u].len+g[u][z].len;
    41   min1[z].cost=min1[u].cost+g[u][z].cost;
    42 }
    43  }
    44  }
    45 }
    46 int main()
    47 {
    48 int n;
    49 while(cin>>n)
    50 {
    51 //初始化
    52 for(int j=1;j<=n;j++)
    53         for(int k=1;k<=n;k++)
    54 {
    55   g[j][k].len=inf;
    56                 g[k][j].cost=inf;
    57 }
    58 int m;
    59    cin>>m;
    60    if(n==0&&m==0)  break;
    61    for(int i=1;i<=m;i++)
    62    {
    63    int a,b,d,p;
    64       cin>>a>>b>>d>>p;
    65    g[a][b].len=d;
    66    g[a][b].cost=p;
    67    g[b][a].len=d;
    68    g[b][a].cost=p;
    69    }
    70    int s,t;
    71    cin>>s>>t;
    72    dijkstr(n,s);
    73        cout<<min1[t].len<<" "<<min1[t].cost<<endl;
    74 }
    75  return 0;
    76 }
    77  
原文地址:https://www.cnblogs.com/xiaoyesoso/p/4265127.html