zoukankan      html  css  js  c++  java
  • C

    - 题目大意

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

    - 解题思路

        简单的最短路径问题,直接用dijkstra,注意重边的情况就行了。

    - 代码

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=1001,INF=0x3f3f3f;
    int vis[N],d[N],num[N];
    int g[N][N],se[N][N];
    void dijkstra(int s, int n)
     {
        memset(num,INF,sizeof(num));
        memset(d, INF, sizeof(d));
        memset(vis, 0, sizeof(vis));
        d[s] = 0;
        num[s]=0;
        while(1) {
            int v = -1;
            for(int u = 1; u <= n; u++)
                {
                if(!vis[u] && (v == -1 || d[u] < d[v]))
                    v = u;
            }
            if(v == -1)
                break;
            vis[v] = 1;
            for(int u = 1; u <= n; u++)
            {
                if(!vis[u] && d[u] > d[v] + g[v][u]) {
                    d[u] = d[v] + g[v][u];
                    num[u]=num[v]+se[v][u];
                }
                else if(!vis[u]&&d[u]==d[v]+g[v][u])
                    num[u]=min(num[u],num[v]+se[v][u]);
            }
        }
    
    }
    int main()
    {
        int n,m,a,b,c,e,x,y;
        while(scanf("%d%d",&n,&m)&&m+n!=0)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    g[i][j]=INF;
                    se[i][j]=INF;
                }
            }
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d%d%d",&a,&b,&c,&e);
                if(g[a][b]>c)
              {
                  g[a][b]=g[b][a]=c;
                se[a][b]=se[b][a]=e;
              }
              else if(g[a][b]==c&&se[a][b]>e)
                se[a][b]=e;
            }
            scanf("%d%d",&x,&y);
            dijkstra(x,n);
            printf("%d %d
    ",d[y],num[y]);
        }
        return 0;
    }
    

      

  • 相关阅读:
    好好的Timer居然有坑?
    你竟然用Integer作为synchronized的锁对象?
    是时候了解Java Socket底层实现了
    带你了解MyBatis一二级缓存
    Java利用反射排序
    用代码移动桌面图标(贪吃蛇)
    servlet上传文件+上传进度显示
    简书导航栏实现
    iPhone手机屏幕尺寸(分辨率)
    iOS深拷贝浅拷贝
  • 原文地址:https://www.cnblogs.com/alpacadh/p/8449525.html
Copyright © 2011-2022 走看看