1. 程式人生 > >九度題目1008:最短路徑問題

九度題目1008:最短路徑問題

題目描述:
給你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時輸入結束。
(1<n<=1000, 0<m<100000, s != t)
輸出:
輸出 一行有兩個數, 最短距離及其花費。
樣例輸入:
3 2
1 2 5 6
2 3 4 5
1 3
0 0
樣例輸出:
9 11
利用Dijkstra演算法
1.初始化,集合K中加入節點1,節點1到本身的最短距離為0,到其他點的距離為無窮或不確定(-1);
2.遍歷與集合K中節點直接相鄰的邊(U,V,C),其中,U屬於集合K,V不屬於K,計算由節點1出發按照已經得到的最短路到達U,再由U經過該邊到達V的路徑長度。比較所有與集合K中節點直接相鄰的非集合K節點該路徑長度,其中路徑長度最小的節點被確定為下一個最短路徑確定的節點,其最短路徑長度即為這個路徑長度,最後將該節點加入集合K。
3.若集合K中已經包含了所有的點,Over;否則重複2
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
 
using namespace std;
#define N 1001
struct E{
    int next;
    int c;
    int cost;
};
 
vector<E> edge[N];
int dis[N];
int cost[N];
bool mark[N];
 
int main()
{
    int n, m;
    int s, t;
    while(scanf("%d %d", &n, &m) != EOF){
        if(n == 0 && m == 0)
            break;
        for(int i = 1; i <= n; i++)
            edge[i].clear();
        for(int i = 0; i < m; i++){
            int a, b, c, cost;
            scanf("%d%d%d%d", &a, &b, &c, &cost);
            E tmp;
            tmp.cost = cost;
            tmp.c = c;
            tmp.next = b;
            edge[a].push_back(tmp);
            tmp.next = a;
            edge[b].push_back(tmp);
        }
        scanf("%d%d", &s, &t);
 
        for(int i = 1; i <= n; i++){
            dis[i] = -1;
            mark[i] = false;
        }
        dis[s] = 0;
        mark[s] = true;
        int newP = s;
 
        for(int i = 1; i <= n; i++){
            for(int j = 0; j < edge[newP].size(); j++){
                int t = edge[newP][j].next;
                int c = edge[newP][j].c;
                int co = edge[newP][j].cost;
                if(mark[t] == true)
                    continue;
                if(dis[t] == -1 ||dis[t] > dis[newP]+c || dis[t] == dis[newP]+c && cost[t] > cost[newP]+co)
                {
                    dis[t] = dis[newP]+c;
                    cost[t] = cost[newP]+co;
                }
            }
 
            int min = 123456789;
            for(int j = 1; j <= n; j++){
                if(mark[j] == true)
                    continue;
                if(dis[j] == -1)
                    continue;
                if(dis[j] < min)
                {
                    min = dis[j] ;
                    newP = j;
                }
            }
            mark[newP] = true;
        }
 
        printf("%d %d\n", dis[t], cost[t]);
    }
 
    return 0;
}
 
/**************************************************************
    Problem: 1008
    User: various
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1552 kb
****************************************************************/


相關推薦

題目1008路徑問題

題目描述: 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。 輸入: 輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為

題目1008路徑問題

最短路徑問題,首先想到了貪心演算法實現的dijkstra演算法;這道題我用了連結串列的儲存方式,其實用鄰接矩陣也可以,主要為了練手,並且連結串列比矩陣要節約空間; 題目描述: 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終

OJ 1008路徑問題 (短路)

時間限制:1 秒 記憶體限制:32 兆 特殊判題:否 提交:8064 解決:2685 題目描述: 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。 輸入

題目1008路徑問題

題目描述: 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。 輸入: 輸入n,m,點的編號是1~n

oj 題目1008路徑問題

這道題告訴我們 INT_MAX, 慎用,dijkstra 有時加溢位了,你都不知道 #include <cstdio> //#include <climits> #include <algorithm> using namespace

OJ 題目1008路徑問題 (Dijstra 演算法)

題目描述: 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。 輸入: 輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為

題目1020小長方形

一.題目描述:     給定一系列2維平面點的座標(x, y),其中x和y均為整數,要求用一個最小的長方形框將所有點框在內。長方形框的邊分別平行於x和y座標軸,點落在邊上也算是被框在內。 輸入:     測試輸入包含若干測試用例,每個測試用例由一系列座標組成,每對座標佔

題目1337尋找長合法括號序列

題目描述: 給你一個長度為N的,由’(‘和’)’組成的括號序列,你能找出這個序列中最長的合法括號子序列麼?合法括號序列的含義便是,在這個序列中,所有的左括號都有唯一的右括號匹配;所有的右括號都有唯一的左括號匹配。例如:((()))()()便是一個長度為10的合法括號序列,而

-題目1138進制轉換

i++ 十進制 ring str 進制數 ble for 進制 進制轉換 http://ac.jobdu.com/problem.php?pid=1138 題目描述: 將一個長度最多為30位數字的十進制非負整數轉換為二進制數輸出。 輸入: 多組數據,每行為一個長度不超過

題目1394五連擊數組

ace 一個 using return include pop turn span printf 轉載請註明本文鏈接http://blog.csdn.net/yangnanhai93/article/details/40506571 題目鏈接:http://ac.job

-題目1214醜數

得到 方法 產生 include pac number return clu n) http://ac.jobdu.com/problem.php?pid=1214 題目描述: 把只包含因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因

筆記路徑算法—Dijkstra(迪傑斯特拉)

意思 最終 else min out 拓展 clas stream 便是 文中代碼下如下: #include<iostream> #include<cstdio> #include<fstream> #include<algor

hihocoder1081 路徑·一

http://hihocoder.com/problemset/problem/1081 描述 萬聖節的早上,小Hi和小Ho在經歷了一個小時的爭論後,終於決定了如何度過這樣有意義的一天——他們決定去闖鬼屋! 在鬼屋門口排上了若干小時的隊伍之後,剛剛進入鬼屋的小Hi和小Ho都頗飢餓,於

hdu3790路徑問題

Problem Description 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。   Input 輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d

資料結構基礎之圖(下)路徑

轉自:http://www.cnblogs.com/edisonchou/p/4691020.html   圖(下):最短路徑 圖的最重要的應用之一就是在交通運輸和通訊網路中尋找最短路徑。例如在交通網路中經常會遇到這樣的問題:兩地之間是否有公路可通;在有多條公路可通的情況下,哪

A.pro讀演算法の11路徑之Dijkstra演算法

此文是獻給OIer看的。講的東西比較基礎(其實我理解Dijkstra花了很長時間)。NOIP2018結束約有1個月了,但是我們仍要繼續前進,為NOIP2019做準備。本節學習Dijkstra的演算法思想和實現,以及優先佇列和堆優化。線段樹也可以做到優化,甚至可能還更快,但是我太弱了不會。。

圖論四路徑演算法

一、廣度優先搜尋 1、思路:距離開始點最近的點首先被賦值,最遠的點最後被賦值。 2、適用範圍:對於非負數權的無圈圖來說(單源最短路徑)。 3、演算法實現: (1)一個佇列記錄每個每個節點的編號。 (2)將起始節點入隊,將所有節點到起始節點的距離設定為無窮大,起始節點到起始節點的距離為0; (3)取

圖論經典演算法(通俗易懂)路徑小生成樹

一、最短路問題 求圖的最短路問題,幾乎是圖論的必學內容,而且在演算法分析與設計中也會涉及。很多書上內容, 實在沒法看,我們的圖論教材,更是編的非常糟糕,吐槽,為啥要用自己學校編的破教材,不過據說 下一屆終於要換書了。 言歸正傳,開始說明最短路問題。

題目120810進位制 VS 2進位制

#include <stdio.h> #include <string.h> char ch1[1000],ch2[4000]; //ch1儲存使用者輸入的10進位制大整數,ch2儲存ch1轉換後的翻轉的2進位制 int num[1000];//儲存ch2轉換的新的2進位制大整數! v

題目1014排名

按總分降序列印過錄取線的學生,總分相同時,id小的在前(id升序)。 程式碼: #include <vector> #include <algorithm> #include <iostream> #include <string