九度題目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)取
圖論經典演算法(通俗易懂):最短路徑和最小生成樹
一、最短路問題 求圖的最短路問題,幾乎是圖論的必學內容,而且在演算法分析與設計中也會涉及。很多書上內容, 實在沒法看,我們的圖論教材,更是編的非常糟糕,吐槽,為啥要用自己學校編的破教材,不過據說 下一屆終於要換書了。 言歸正傳,開始說明最短路問題。
九度 題目1208:10進位制 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