九度-1008 最短路径

来源:互联网 发布:unity3d itween path 编辑:程序博客网 时间:2024/05/21 17:15
题目描述:
给你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 21 2 5 62 3 4 51 30 0
样例输出:
9 11

错误原因:

      1.使用<limits.h>,设无穷大为INT_MAX时没有注意INT_MAX+正数<0
       2.编号从1开始,不是从0

# include <stdio.h># include <limits.h> typedef struct distance{  int d,p;    }dis;dis arcs[1001][1001];int main (){  int n,m,i,j,a,b,d,p,s,t,mind,minp,v;  int final[1001],sd[1001],cost[1001];    while (scanf ("%d%d",&n,&m)&&n+m!=0)  {    for (i=1;i<=n;i++)      for (j=1;j<=n;j++)      {        arcs[i][j].d=arcs[i][j].p=INT_MAX;      }    for (i=0;i<m;i++)    {      scanf ("%d%d%d%d",&a,&b,&d,&p);      arcs[a][b].d=d;      arcs[a][b].p=p;       }    scanf ("%d%d",&s,&t);    for (i=1;i<=n;i++)    {      final[i]=0;      cost[i]=arcs[s][i].p;      sd[i]=arcs[s][i].d;     }    sd[s]=cost[s]=0;     final[s]=1;    for (i=1;i<n;i++)    {      mind=INT_MAX;      for (j=1;j<=n;j++)        if (!final[j]&&sd[j]<mind)        {          v=j;          mind=sd[j];          minp=cost[j];                                 }      final[v]=1;      for (j=1;j<=n;j++)        if (!final[j]&&(mind+arcs[v][j].d>0)&&(mind+arcs[v][j].d<sd[j]||mind+arcs[v][j].d==sd[j]&&minp+arcs[v][j].p<cost[j]))        {          sd[j]=mind+arcs[v][j].d;          cost[j]=minp+arcs[v][j].p;                                             }         }    printf ("%d %d\n",sd[t],cost[t]);          }  return 0;   } 
原创粉丝点击