• hdu 3790 最短路径问题





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

    Input
    输入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)
     

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

    Sample Input
    3 2 1 2 5 6 2 3 4 5 1 3 0 0
     

    Sample Output
    9 11
    #include<queue>
    #include<stack>
    #include<vector>
    #include<math.h>
    #include<stdio.h>
    #include<numeric>//STL数值算法头文件
    #include<stdlib.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<functional>//模板类头文件
    using namespace std;
    
    const int INF=1e9+7;
    const int maxn=1010;
    
    int n,m,st,ed;
    int a,b,c,d;
    int tu[maxn][maxn];
    int cost[maxn][maxn];
    
    int dijkstra(int st,int ed)
    {
        int i,j,k;
        int vis[maxn],value[maxn],dis[maxn];
        for(i=1; i<=n; i++)
        {
            dis[i]=tu[st][i];
            value[i]=cost[st][i];
        }
        memset(vis,0,sizeof(vis));
        vis[st]=1;
        for(i=1; i<n; i++)
        {
            int minn=INF;
            for(j=1; j<=n; j++)
            {
                if(!vis[j]&&dis[j]<minn)
                {
                    k=j;
                    minn=dis[j];
                }
            }
            vis[k]=1;
            for(j=1; j<=n; j++)
            {
                if(!vis[j]&&tu[k][j]<INF)
                {
                    if(dis[j]>dis[k]+tu[k][j])
                    {
                        dis[j]=dis[k]+tu[k][j];
                        value[j]=value[k]+cost[k][j];
                    }
                    else if(dis[j]==dis[k]+tu[k][j])
                    {
                        if(value[j]>value[k]+cost[k][j])
                            value[j]=value[k]+cost[k][j];
                    }
                }
            }
        }
        printf("%d %d
    ",dis[ed],value[ed]);
    }
    
    int main()
    {
        int i,j;
        while(~scanf("%d %d",&n,&m)&&(n||m))
        {
            for(i=1; i<=n; i++)
                for(j=1; j<=n; j++)
                {
                    tu[i][j]=INF;
                    cost[i][j]=INF;
                }
            while(m--)
            {
                scanf("%d %d %d %d",&a,&b,&c,&d);
                if(tu[a][b]>c)
                {
                    tu[a][b]=tu[b][a]=c;
                    cost[a][b]=cost[b][a]=d;
                }
                else if(tu[a][b]==c)
                {
                    if(cost[a][b]>d)
                        cost[a][b]=cost[b][a]=d;
                }
            }
            scanf("%d %d",&st,&ed);
            dijkstra(st,ed);
        }
        return 0;
    }
    




















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

    Input
    输入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)
     

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

    Sample Input
    3 2 1 2 5 6 2 3 4 5 1 3 0 0
     

    Sample Output
    9 11
  • 相关阅读:
    The formatter threw an exception while trying to deserialize the message in WCF
    通过Web Deploy方式部署WCF
    The Managed Metadata Service or Connection is currently not available
    How to create Managed Metadata Column
    冒泡算法
    asp.net core 实战项目(一)——ef core的使用
    Vue学习笔记入门篇——安装及常用指令介绍
    Vue学习笔记入门篇——数据及DOM
    Vue学习笔记目录
    Chart.js在Laravel项目中的应用
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/7264867.html
Copyright © 2020-2023  润新知