HDU3790(比较坑的最短路)

最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 15024    Accepted Submission(s): 4573

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

Source

浙大计算机研究生复试上机考试-2010年

这题输入的时候要特别注意呀,首先题目并没有说有重边,但是不判断重边会WA,还有就是先要保证在最短路经的情况下心求花费,而不是两个孤立的求,所以输入的时候要特别注意,这是到水的很有意义的题目

#include <iostream>
#include <string.h>
#include <queue>
#include <vector>
#include <utility>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define maxn 1210
#define LL int
const LL  INF = 1e9+1000;

int mp[maxn][maxn];
int money[maxn][maxn];
LL dis[maxn];
LL mny[maxn];
int n,m;
void init()
{
    for(int i = 1; i <= n; i++) fill(money[i],money[i]+n+1,INF), fill(mp[i],mp[i]+n+1,INF);
    fill(dis,dis+n+1,INF);
    fill(mny,mny+n+1,INF);

}
void SPFA(int s)
{
    queue<int> Q;
    dis[s] = 0;
    mny[s] = 0;
    Q.push(s);
    while(!Q.empty())
    {
        int u = Q.front();
        Q.pop();
        for(int i = 1;i <= n; i++)
        {
            if(dis[i] > mp[u][i] + dis[u])
            {
                dis[i] = mp[u][i] + dis[u];
                mny[i] = money[u][i] + mny[u];
                Q.push(i);
            }
            else if(dis[i] ==  mp[u][i] + dis[u])
            {
                mny[i] = min(mny[i],money[u][i] + mny[u]);

            }
        }
    }

}
int  main()
{
#ifdef xxz
    freopen("in.txt","r",stdin);
#endif // xxz

    while(~scanf("%d%d",&n,&m))
    {
        if( n == 0 && m == 0) break;
        init();
        for(int i = 1; i <= m; i++)
        {
             int a,b ,c, d;
             scanf("%d%d%d%d",&a,&b,&c,&d);
             if(c < mp[a][b])
             {
                 mp[a][b] = mp[b][a] = c;
                 money[a][b] = money[b][a] = d;
             }
             else if(c == mp[a][b])
             {
                if(d < money[a][b]) money[a][b] = money[b][a] = d;
             }

        }
        int st,ed;
        scanf("%d%d",&st,&ed);
        SPFA(st);
        printf("%d %d\n",dis[ed],mny[ed]);
    }
    return 0;
}
时间: 2024-07-30 10:15:53

HDU3790(比较坑的最短路)的相关文章

JavaScript新手学习笔记4——我记不住的几个坑:短路逻辑、按值传递、声明提前

1.短路逻辑 逻辑运算中,如果前一个条件已经可以得出最终结论,则后续所有条件不再执行!这里的逻辑运算指的是逻辑与和逻辑或. 我们要理解逻辑与是两个条件都为真的时候,才为真,如果第一个就是假的,那么后面一个也不用执行了.逻辑非是两个条件中有一个是真,则结果为真,所以只要第一个为真,那么结果为真,后面一条语句就不用执行了.于是又如下例题: console.log(2&&3); //3 console.log(2||3); //2 console.log(0&&1); //0 c

HDU Today---hdu2112(最短路-_-坑在是无向图)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 spfa或者迪杰斯特拉都可以 注意公交车是有来回的--- #include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <cmath> #i

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

UVA 1048 - Low Cost Air Travel(最短路)

UVA 1048 - Low Cost Air Travel 题目链接 题意:给定一些联票,在给定一些行程,要求这些行程的最小代价 思路:最短路,一张联票对应几个城市就拆成多少条边,结点表示的是当前完成形成i,在城市j的状态,这样去进行最短路,注意这题有坑点,就是城市编号可能很大,所以进行各种hash 代码: #include <cstdio> #include <cstring> #include <vector> #include <queue> #in

POJ2387 水水最短路

迪杰斯特拉哦,很挫哦 A - Til the Cows Come Home Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2387 Description Bessie is out in the field and wants to get back to the barn to get as much sleep as possib

10年山东省赛-E-最短路

题目连接:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2155&cid=1430 题意:输入一个n个节点,m条边的图,然后k条记录,纪录可能为: 0 x:添加上x这个节点: 1 x y :输出从x到y的最短路: 思路:floyd: 使我更加了解了floyd的思想,就是每加入一个点,更新一次最短路. 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define INF 1&l

SDUT 2930-人活着系列之开会(最短路Floyd)

人活着系列之开会 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 人活着如果是为了事业,从打工的到老板的,个个都在拼搏,奋斗了多年终于有了非凡成就,有了一笔丰富的钱财.反过来说,人若赚取了全世界又有什么益处呢?生不带来,死了你还能带去吗?金钱能买保险,但不能买生命,金钱能买药品,但不能买健康,人生在世,还是虚空呀! 在苍茫的大海上,有很多的小岛,每个人都在自己的小岛上.又到了开会的时候了,鹏哥通过飞信告知了每个人,然后大家就开

[ An Ac a Day ^_^ ][kuangbin带你飞]专题四 最短路练习 POJ 2240 Arbitrage spfa求负环

题意就是问倒腾外币能不能升值 不用spfa 用其他的最短路算法也可以 松弛条件换成dist[v]<dist[u]*e[u][i].value 当然 貌似只有spfa有这个坑…… 有A  (value>1.0) A 这种情况……我的天 用Dij Floyd都只用判断如果松弛到了自己 那么一定有环 直接跳出就行 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<

关于最短路的几个算法

关于最短路的几个算法有Dijkstra,Bellman-Ford,Floyd Dijkstra: Dijkstra适用于边权为正的情况,从单个源点出发,到其他所有结点的最短路 算法的核心是用已经知道的结点 i 的距离 d[i] 去更新和这个结点相连的其他结点的距离 void Dijkstra() { memset(vis,0,sizeof(vis)); //vis数组表示结点是否被访问 memset(d,INF,sizeof(d)); //d数组表示到结点的距离 d[s]=0; //将起点的距离