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

九度OJ-題目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

來源:


2010年浙江大學計算機及軟體工程研究生機試真題

這道題使用Dijkstra最短路徑演算法即可,只需多加一個當路徑長度相同時選擇花費最小的判斷。MAX值要設大一點,我一開始設的10000,Wrong Answer。

#include<stdio.h>
#include<string.h>

#define MAX 10000000

int n, m;
int sd = 0, lc = 0;//最短路徑,最少花費
int visited[1001];
int dist[1001][1001];//長度
int cost[1001][1001];//花費
int disp[1001];//st到各個點的最短路徑
int cosp[1001
]; int dijk(int st, int en){ sd= 0; lc= 0; int u; int min; int i, j; memset(visited, 0, sizeof(visited)); for(int p= 1; p<= n; p++){ disp[p]= MAX; cosp[p]= MAX; } disp[st]= 0;//到本身距離為0 cosp[st]= 0; for(i= 1; i<= n; i++){ u= -1; min= MAX; for
(j= 1; j<= n; j++){ if(disp[j]< min && visited[j]== 0){ min= disp[j]; u= j; } } if(u== -1){//st點與其他點不相連 break; } visited[u]= 1; for(int v= 1; v<= n; v++){ if(dist[u][v]< MAX && visited[v]== 0){ if(dist[u][v]+ disp[u]< disp[v]){ disp[v]= dist[u][v]+ disp[u]; cosp[v]= cost[u][v]+ cosp[u]; } else if(dist[u][v]+ disp[u]== disp[v]){ if(cost[u][v]+ cosp[u]< cosp[v]){ cosp[v]= cost[u][v]+ cosp[u]; } } } } } sd=disp[en]; lc=cosp[en]; return 0; } int main(){ int i; int a, b, d, p; int st, en; while(scanf("%d %d", &n, &m)!=EOF){ if(n==0 && m==0){ break; } for(int p= 1; p<= n; p++){ for(int q= 1; q<= n; q++){ dist[p][q]= MAX; cost[p][q]= MAX; } } for(i= 0; i< m; i++){ scanf("%d %d %d %d", &a, &b, &d, &p); dist[a][b]= d; cost[a][b]= p; dist[b][a]= d; cost[b][a]= p; } scanf("%d %d", &st, &en); dijk(st, en); printf("%d %d\n", sd, lc); } return 0; }

相關推薦

OJ-題目1008 路徑問題

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

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之間有一條邊,且其長度為

OJ 1008 路徑問題

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

題目1008路徑問題

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

-1008 路徑

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

OJ 題目1204:農夫、羊、菜和狼的故事

pla pan wol 題目 r+ ear play struct tab 思路:廣度 優先 記錄路徑長度 但是題目的意思好像是要記錄具體路徑 下次再搞吧 題目描述: 有一個農夫帶一只羊、一筐菜和一只狼過河.果沒有農夫看管,則狼要吃羊,羊要吃菜.但是船很小,只

OJ-題目1009:二叉搜索樹

提交 二叉排序樹 軟件 amp cpp creat .com xheditor ear 題目1009:二叉搜索樹 從如今開始打算重新啟動刷題征程。程序猿的人生不須要解釋! 這次撇開poj hoj等難度較大的oj系統,從九度入手(已經非常長時間沒寫過代碼

OJ-題目1009:二叉搜尋樹

題目1009:二叉搜尋樹         從現在開始打算重啟刷題征程。程式設計師的人生不需要解釋! 這次撇開poj hoj等難度較大的oj系統,從九度入手(已經很長時間沒寫過程式碼了),主要先“叫醒” 沉睡依舊的大腦。唉~真的很長時間沒寫部落格,沒寫程式碼了,只能加油吧!

OJ題目1089:數字反轉

題目描述:     12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,現在又任意兩個正整數,問他們兩個數反轉的和是否等於兩個數的和的反轉。 輸入:     第一行一個正整數表示測試資料的個數n。     只有n行,每行兩個正整數a和b(0<a,b<=10000)。 輸出

OJ 題目1014:排名

題目描述:     今天的上機考試雖然有實時的Ranklist,但上面的排名只是根據完成的題數排序,沒有考慮每題的分值,所以並不是最後的排名。給定錄取分數線,請你寫程式找出最後通過分數線的考生,並將他們的成績按降序列印。 輸入:     測試輸入包含若干場考試的資訊。每場

OJ題目1201:二叉排序樹

紀念一下終於在二叉樹上的程式碼準確率,但還是在給root分配空間的時候忘記要寫了  悲劇 還沒看到提示要考慮忽略重複元素,這個好解決 題目描述:     輸入一系列整數,建立二叉排序數,並進行前

oj 題目1208:10進位制 VS 2進位制

參考了 根據參考1有 #include <cstdio> #include <cstring> #define MAXN 4000 int main(){ int to[MAXN]; int from[MAXN];

OJ-題目1521:二叉樹的映象

題目連結地址: 題目描述: 輸入一個二叉樹,輸出其映象。 輸入: 輸入可能包含多個測試樣例,輸入以EOF結束。 對於每個測試案例,輸入的第一行為一個整數n(0<=n<=1000,n代表將要輸入的二叉樹節點的個數(節點從1開始編號)。接下來一行有n個數字,

OJ-題目1047 素數判定

題目描述: 給定一個數n,要求判斷其是否為素數(0,1,負數都是非素數)。 輸入: 測試資料有多組,每組輸入一個數n。 輸出: 對於每組輸入,若是素數則輸出yes,否則輸入no。 樣例輸入: 13 樣例輸出: yes 來源: 2009年哈爾

OJ-題目1019:簡單計算器

題目描述:     讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。 輸入:     測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用一個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果

OJ-題目1214:醜數

題目連結地址: 題目描述:把只包含因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。 輸入:輸入包括一個整數N(1<=N<=1500)。 輸

OJ-題目1468-Sharing-連結串列

題目描述: To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let

OJ題目解答1001

題目描述:     This time, you are supposed to find A+B where A and B are two matrices, and then count the number of zero rows and columns. 輸入

OJ題目1047:素數判定

時間限制:1 秒 記憶體限制:32 兆 特殊判題:否 題目描述: 給定一個數n,要求判斷其是否為素數(0,1,負數都是非素數)。 輸入: 測試資料有多組,每組輸入一個數n。 輸出: 對於每組輸入,若是素數則輸出yes,否則輸入no。 樣例輸入: 13 樣例輸出: yes #include