HDU-3790 最短路最小花费

判断路径相等时的情况

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;

#define pf printf
#define sf scanf
#define mp make_pair
#define INF 0x3f3f3f3f

const int MAXN = 1000 + 5;

int n,m;

struct node
{
    int d,fee;
}g[MAXN][MAXN];

int dis[MAXN],f[MAXN],vis[MAXN];

void dijkstra(int v)
{
    int i,j,mind,minf,dir;
    for(i=1;i<=n;i++)
    {
        dis[i] = f[i] = INF;
        vis[i] = 0;
    }
    dis[v] = f[v] = 0;
    vis[v] = 1;
    for(i=1;i<=n;i++)
    {
        mind = minf = INF;
        for(j=1;j<=n;j++)
        {
            if(!vis[j] && (dis[j]<mind || (dis[j]==mind && f[j]<minf)))
            {
                mind = dis[j];
                minf = f[j];
                dir = j;
            }
        }
        vis[dir] = 1;
        for(j=1;j<=n;j++)
        {
            if(!vis[j] && g[dir][j].d<INF && (dis[j] > (dis[dir]+g[dir][j].d) || (dis[j] == (dis[dir]+g[dir][j].d) && f[j]>f[dir]+g[dir][j].fee)))
            {
                dis[j] = dis[dir]+g[dir][j].d;
                f[j]=f[dir]+g[dir][j].fee;
            }
        }
    }

}

int main()
{
    int i,j;
    int a,b,d,fee,st,ed;
    while(sf("%d %d",&n,&m)==2,m+n)
    {
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                g[i][j].d = g[i][j].fee = (i==j ? 0:INF);
            }
        }
        for(i=0;i<m;i++)
        {
            sf("%d%d%d%d",&a,&b,&d,&fee);
            if(d < g[a][b].d)
            {
                g[a][b].d = g[b][a].d = d;
                g[a][b].fee = g[b][a].fee = fee;
            }
            else if(d == g[a][b].d)
                g[a][b].fee = g[b][a].fee = min(g[a][b].fee,fee);
        }
        sf("%d%d",&st,&ed);
        dijkstra(st);
        pf("%d %d\n",dis[ed],f[ed]);
    }
    return 0;
时间: 2024-08-02 07:01:30

HDU-3790 最短路最小花费的相关文章

AOJ2249 最短路+最小花费(双权值)

写题解之前先骂一下这道题 xxx给数据范围点数<1e4,边数<2e4,结果我开2e4和3e4都RE,然后找问题一个多小时,最后我开了1e5和2e5,题面太能唬人了吧!?真是sb题面 ------------------------------------------分割线------------------------------------ 题目大意:给n个点和m条边,每条边给了起始点,距离和价格,求在保证点1到其他n-1个点的路径都是最短路的前提下所有路的价格之和的最小值 简单的Dijks

HDU 3790最短路径问题 [最短路最小花费]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3790] 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 25620    Accepted Submission(s): 7650 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你

【最短路+最小费用】hdu 3790 最短路径问题

Source : hdu 3790 最短路径问题 http://acm.hdu.edu.cn/showproblem.php?pid=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,终

hdu 3790 最短路径问题(两个限制条件的最短路)

http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,只是在判断条件时多考虑了花费. 注意重边. #include <stdio.h> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h>

(最短路)hdu 3790

A - A Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 3790 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间

UOJ #216 最小花费最短路

[题目描述]: 给你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时输入结束. [输出描述]: 输出一行有两个数, 最短距离及其花费. [样例输入]: 3 2 1 2 5 6 2 3

HDU 5889 Barricade (bfs + 最小割)

Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Description The empire is under attack again. The general of empire is planning to defend his castle. The land can be seen as N towns and M roads, and each

hdu 5521 最短路

Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1656    Accepted Submission(s): 515 Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer Joh

hdu 3790 最短路径问题(双重权值,dijkstra算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费!!! (2)更新路径的时候要注意更新花费. 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int INF=9999999; 5 int map[1010][1010],Min,n,co