zoukankan      html  css  js  c++  java
  • 3790

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define N 1010
    int map[N][N],f[N][N],path[N],d[N],visited[N],fee[N];
    dijkstra(int v0,int vt,int n)
    {
        int v,i,min,w,next,sum=0,k;
        memset(visited,0,sizeof(visited));
        for(v=0;v<n;v++)
        {
            d[v]=0x7FFFFFFF;//初始化为权值
      fee[v]=0x7FFFFFFF;
            visited[v]=0;//初始化过程 
        }
        path[v0]=v0;
        d[v0]=fee[v0]=0;
        visited[v0]=1;
        for(i=1,v=v0;i<n;i++)
        {        
            for(w=0;w<n;w++)
            {
                if(visited[w]==0&&map[v][w]!=0x7FFFFFFF)
       {
        if(d[v]<d[w]-map[v][w])
        {
         d[w]=d[v]+map[v][w];
         fee[w]=fee[v]+f[v][w];
         path[w]=v;
        }
        else if(d[v]==d[w]-map[v][w])
        {
         if(fee[v]<fee[w]-f[v][w])
          fee[w]=fee[v]+f[v][w];
        }
       }
            }
            min=0x7FFFFFFF;
            for(w=0;w<n;w++)
                if(visited[w]==0&&d[w]<min)
                {
                    v=w;
                    min=d[w];
                }
            visited[v]=1;//加入标记
        }


       /* for(i=0;i<n;i++)//求两点之间具体的路径用的,本题不需要。
        {
            if(i==v0) continue;
            printf("从%d到%d最短路为 :%d ",v0,i,d[i]);
            next=path[i];
      printf("%d--",i);
            while(next!=path[next])
            {
                printf("%d--",next);
                next=path[next];
            }
      printf("%d ",v0);
        }*/




     /*


     for(i=0;i<n;i++)//这里是通过回溯早花费,不可取。
     {
      if(i!=vt) continue;
      next=vt;
      while(next!=path[next])
      {
       k=path[next];
       sum+=f[k][next];
       next=path[next];
      }
      break;
     }
     printf("%d %d ",d[vt],sum);
     */
     printf("%d %d ",d[vt],fee[vt]);
    }




    int main()
    {
        int n,m,i,j,a,b,x,y,s,t;
        while(scanf("%d %d",&n,&m),n&&m)
        {
            for(i=0;i<n;i++)
                for(j=0;j<n;j++)
                    map[i][j]=0x7FFFFFFF;
            for(i=0;i<m;i++)
            {
                scanf("%d %d %d %d",&a,&b,&x,&y);
                if(x<map[a-1][b-1])
                {
                    map[a-1][b-1]=map[b-1][a-1]=x;
                    f[a-1][b-1]=f[b-1][a-1]=y;
       }
       else if(x==map[a-1][b-1])//路径相同则取花费小的
       {
        if(y<f[a-1][b-1])
         f[a-1][b-1]=f[b-1][a-1]=y;
       }


            }
            scanf("%d %d",&s,&t);
            dijkstra(s-1,t-1,n);
        }
        system("pause");
        return 0;
    }
    /*
    3 2
    1 2 5 6
    2 3 4 5
    1 3


    //下面的数据会测试两条路径一样长的时候的花费,会有错误,记录路径的时候不能保证花费是最少的。
    5 7
    1 2 2 1
    2 4 6 15
    4 5 4 6
    5 3 2 7
    3 1 9 3
    3 2 3 7
    3 4 3 4
    1 4
    */

  • 相关阅读:
    梯度下降法-4.向量化和数据标准化
    梯度下降法-3.实现线性回归中的梯度下降法
    梯度下降法-2.线性回归中的梯度下降法
    梯度下降法-1.原理及简单实现
    线性回归算法-5.更多思考
    TCP/IP协议
    TFTP 服务器
    python3 系统编程进程
    python3 私有化 属性property
    python3 面向对象
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410951.html
Copyright © 2011-2022 走看看