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

    最短路径问题

    给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。

    输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。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

    Sample Output

    9 11

    这题开始用flody超时,然后用dijkstral,然后就开始无限WA

    最后发现最短路径相等时要把花费分出来算,不能放在一起

    #include<stdio.h>
    #include<string.h>
    #define INF 0x3f3f3f3f
    int w[1005][1005],dis[1005][1005];
    int d[1005],v[1005],c[1005];
    int Min(int a,int b)
    {
         return a<b?a:b;
    }
    void dijkstral(int v0,int n)
    {
         int i,x,temp,y;
         for(i=1;i<=n;i++)
         {
              d[i]=dis[v0][i];
              c[i]=w[v0][i];
              v[i]=0;
         }
         v[v0]=1;
         d[v0]=0;
         for(i=1;i<=n;i++)
         {
              temp=INF;
              for(y=1;y<=n;y++)
                   if(!v[y]&&temp>=d[y])
                   temp=d[x=y];
              v[x]=1;
              for(y=1;y<=n;y++)
              {
                   if(d[y]>d[x]+dis[x][y]&&!v[y])
                   {
                        d[y]=d[x]+dis[x][y];
                        c[y]=c[x]+w[x][y];
                   }
                   else if(d[y]==d[x]+dis[x][y]&&!v[y])
                   {
                        c[y]=Min(c[y],c[x]+w[x][y]);
                   }
              }
         }
    }
    int main()
    {
         int i,j,n,m,len,val,x,y;
         while(scanf("%d %d",&n,&m)!=EOF,n||m)
         {
             for(i=1;i<=n;i++)
                   for(j=1;j<=n;j++)
                   {
                        dis[i][j]=(i==j)?0:INF;
                        w[i][j]=INF;
                   }
    
                   for(i=0;i<m;i++)
                   {
                        scanf("%d %d %d %d",&x,&y,&len,&val);
                        if(dis[x][y]>len)//这里要分开,开始和等于的情况放在一起,无限WA
                        {
                             dis[x][y]=dis[y][x]=len;
                             w[x][y]=w[y][x]=val;
                        }
                        else if(dis[x][y]==len)
                        {
                             w[x][y]=w[y][x]=Min(w[x][y],val);
                        }
                   }
                   scanf("%d %d",&x,&y);
                   dijkstral(x,n);
                   printf("%d %d
    ",d[y],c[y]);
         }
         return 0;
    }
  • 相关阅读:
    初步掌握HDFS的架构及原理
    Hadoop 生态系统
    安装Hadoop,让word count飞起来
    十分钟看透MapReduce
    初识Hadoop
    线性回归-理论篇
    逻辑回归
    hdu 4848 Wow! Such Conquering! (floyd dfs)
    hdu 4856 Tunnels (记忆化搜索)
    poj 3237 Tree [LCA] (树链剖分)
  • 原文地址:https://www.cnblogs.com/llei1573/p/3255949.html
Copyright © 2011-2022 走看看