杭电ACM HDU 3790 最短路径问题

给你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

两点最短距离(无负环)用dijstra算法 这题不同在于有两个权值。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
using namespace std;

const int INF=0x3f3f3f3f;
const int MX=1000+10;

int n,m,Map[MX][MX],price[MX][MX],dis[MX],pre[MX];
void init(){
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++){
            Map[i][j]=INF;
            price[i][j]=INF;
        }
}
void dijkstra(int v0){
    bool vis[MX];
    for (int i=1;i<=n;i++){
        dis[i]=Map[v0][i];
        pre[i]=price[v0][i];
        vis[i]=false;
    }
    dis[v0]=0;
    vis[v0]=true;
    for (int i=1;i<=n;i++){
        int tmp=INF,P=INF,u;
        for (int j=1;j<=n;j++)
            if (!vis[j]&&dis[j]<tmp){
                u=j;
                tmp=dis[j];
            }
        vis[u]=true;
        for (int j=1;j<=n;j++)
            if (!vis[j]){
                if (dis[u]+Map[u][j]<dis[j]){
                    dis[j]=dis[u]+Map[u][j];
                    pre[j]=pre[u]+price[u][j];
                }else if (dis[u]+Map[u][j]==dis[j]&&pre[u]+price[u][j]<pre[j])
                    pre[j]=pre[u]+price[u][j];
            }

    }
}
int main(){
    while (~scanf ("%d %d",&n,&m)){
        if (n==0&&m==0) break;
        init();
        while (m--){
            int u,v,w,p;
            scanf ("%d %d %d %d",&u,&v,&w,&p);
            if (Map[u][v]>w){
                Map[u][v]=w;
                Map[v][u]=w;
                price[u][v]=p;
                price[v][u]=p;
            }else if (Map[u][v]==w&&price[u][v]>p){
                price[u][v]=p;
                price[v][u]=p;
            }
        }
        int s,t;
        scanf ("%d %d",&s,&t);
        dijkstra(s);
        printf ("%d %d\n",dis[t],pre[t]);
    }
    return 0;
}
				
时间: 2024-08-05 02:33:24

杭电ACM HDU 3790 最短路径问题的相关文章

ACM: HDU 3790 最短路径问题-Dijkstra算法

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

杭电ACM HDU 1869 六度分离

1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即只用6个人就可以将他们联系在一起,因此他的理论也被称为 “六度分离”理论(six degrees of separation).虽然米尔格兰姆的理论屡屡应验,一直也有很多社会学家对其兴趣浓厚,但是在30多年的时间里,它从来就没有得到过严谨的证明,只 是一种带有传奇色彩的假说而已. Lele对这个理论相当有兴趣

杭电ACM hdu 2079 选课时间 (模板)

Problem Description 又到了选课的时间了,xhd看着选课表发呆,为了想让下一学期好过点,他想知道学n个学分共有多少组合.你来帮帮他吧.(xhd认为一样学分的课没区别) Input输入数据的第一行是一个数据T,表示有T组数据.每组数据的第一行是两个整数n(1 <= n <= 40),k(1 <= k <= 8).接着有k行,每行有两个整数a(1 <= a <= 8),b(1 <= b <= 10),表示学分为a的课有b门. Output对于每

杭电 ACM HDU Train Problem I

Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 25008    Accepted Submission(s): 9435 Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays

杭电 ACM HDU 1217 Arbitrage(最短路 floyd算法)

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5272    Accepted Submission(s): 2418 Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform

杭电ACM hdu 1398 Square Coins

Problem Description People in Silverland use square coins. Not only they have square shapes but also their values are square numbers. Coins with values of all square numbers up to 289 (=17^2), i.e., 1-credit coins, 4-credit coins, 9-credit coins, ...

杭电OJ(HDU)-ACM Steps-Chapter Two-《Biker&#39;s Trip Odometer》《Climbing Worm》《hide handkerchief》《Nasty Hac》

1.2.1 Biker's Trip Odometer #include<stdio.h> #include<math.h> const double PI=acos(-1.0); /* 计算题,根据公式做就行,PI*d*r/(12*5280);res1/t*3600; Sample Input 26 1000 5 27.25 873234 3000 26 0 1000 Sample Output Trip #1: 1.29 928.20 Trip #2: 1179.86 1415

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

杭电OJ(HDU)-ACMSteps-Chapter Two-《An Easy Task》《Buildings》《decimal system》《Vowel Counting》

http://acm.hdu.edu.cn/game/entry/problem/list.php?chapterid=1§ionid=2 1.2.5 #include<stdio.h> /* 题意:找闰年. if((i%4==0 && i%100!=0) || i%400==0)count++; 3 2005 25 1855 12 2004 10000 2108 1904 43236 */ int main() { int t,y,n; int i,count=0; whil