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
這些用Dijkstra解決的圖論問題還是很常見的。這道題在常規題的基礎上加上了每條路的花費。但在本質上絲毫不影響最短路的演算法思想。
其實只要在每次更新dis[j]的時候,也更新一次s[j],它表示從起點到j點的花費最小值,特別要注意的是,當dis[j]和dis[k]+map[k][j]相等的時候,不更新dis[j],但要更新s[j],因為相等的距離,題目要求花費的最小值,所以這種情況要注意一下。 另外,陣列不要開太小,像我第一次開到1000,邊界值沒注意到,就沒過。還有給定的MAX應該大一些。
#include <iostream>
#include <cstring>
#define MAX 1<<29
using namespace std;

int map[1010][1010];
int cost[1010][1010];
bool visit[1010];
int dis[1010];   //表示從起點到各點的距離
int s[1010];     //表示從起點到各點的花費
int n,m;

void dijkstra(int start,int end){
    memset(visit,0,sizeof(visit));
    int k;
    for(int i=1;i<=n;i++){
        dis[i] = map[start][i];
    }
    for(int i=1;i<=n;i++){
        s[i] = cost[start][i];
    }
    for(int i=1;i<=n;i++){
        int temp = MAX;
        k = 0;
        for(int j=1;j<=n;j++){
            if(!visit[j] && dis[j] < temp){
                temp = dis[j];
                k = j;
            }
        }
        visit[k] = 1;
        for(int j=1;j<=n;j++){
            if(!visit[j] && dis[j] > (dis[k]+map[k][j])){
                dis[j] = dis[k]+map[k][j];
                s[j] = s[k] + cost[k][j];
            }
            else if(!visit[j] && dis[j] == (dis[k]+map[k][j])){
                if(s[j] > s[k]+cost[k][j])
                    s[j] = s[k]+cost[k][j];
            }
        }
    }
    cout<<dis[end]<<" "<<s[end]<<endl;
}

int main(){
    while(cin>>n>>m){
        if(n == 0)
            break;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++)
                map[i][j] = cost[i][j] = MAX;
        }
        int a,b,d,p;
        for(int i=0;i<m;i++){
            cin>>a>>b>>d>>p;
            map[a][b] = map[b][a] = d;
            cost[a][b] = cost[b][a] = p;
        }
        int start,end;
        cin>>start>>end;
        dijkstra(start,end);
    }
    return 0;
}


相關推薦

OJ 1008 路徑問題

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

OJ-題目1008 路徑問題

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

OJ 1008路徑問題 (短路)

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

-1008 路徑

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

OJ路徑演算法,Dijk

先構造有向圖,再用Dijk演算法。實現時注意 set 中點的距離的更新。 #include <stdio.h> #include <string.h> #include <algorithm> #include <set>

分離(路徑之Floyd演算法)

六度分離點我找原題Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 31   Accepted Submission(s) : 14Font: Times

OJ 1533 長上升子序列 (基於貪心和二分查詢)

題目描述: 給定一個整型陣列, 求這個陣列的最長嚴格遞增子序列的長度。 譬如序列1 2 2 4 3 的最長嚴格遞增子序列為1,2,4或1,2,3.他們的長度為3。 輸入: 輸入可能包含多個測試

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

題目1008路徑問題

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

:題目1008路徑問題

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

題目1008路徑問題

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

OJ-1112-導彈攔截-長不增子序列

研究生 -h 計算 不能 problems ear 來源 分隔 std 題目1112:攔截導彈 時間限制:1 秒 內存限制:32 兆 特殊判題:否 提交:5218 解決:2603 題目描述: 某國為了防禦敵國的導彈襲擊,開發出一種導彈攔截系統。但是這種導彈攔截系統有一

分離 (無向圖路徑問題)

1967年,美國著名的社會學家斯坦利·米爾格蘭姆提出了一個名為“小世界現象(small world phenomenon)”的著名假說,大意是說,任何2個素不相識的人中間最多隻隔著6個人,即只用6個人就可以將他們聯絡在一起,因此他的理論也被稱為“六度分離”理論(six degrees of sepa

OJ 1006:街區路徑問題

OJ 1006:街區最短路徑問題 因為只能東西,南北走,所以求一點到另一點的距離就等於橫縱座標的差的絕對值之和,我們將每個點的橫座標取出來,縱座標取出來,這個問題就成了這些數到哪個數的距離的和最小,分別求出橫座標和縱座標對應的哪個和,然後求和就行了 n=int(input()) wh

SDUT OJ 2143 圖結構練習——路徑

圖結構練習——最短路徑 Time Limit: 1000MS Memory limit: 65536K 題目描述  給定一個帶權無向圖,求節點1到節點n的最短路徑。 輸入

路徑演算法複雜總結

Dijkstra:O(n2)適用於權值為非負的圖的單源最短路徑,用斐波那契堆的複雜度O(E+VlgV), BellmanFord:適用於權值有負值的圖的單源最短路徑,並且能夠檢測負圈,複雜度O(VE)

路徑 oj

 “師創杯”山東理工大學第五屆ACM程式設計競賽#include <stdio.h> #define MAX 223372036854775807 long long map[100][100],d[100][10]; //map存圖,d存每個點不同情況的狀態 int vi[100][

hdu oj 2544 短路(路徑

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 31874    Accepted Submissio

(路徑算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理與介紹

void empty borde fast 默認 grand else 理解 scan 這一篇博客以一些OJ上的題目為載體。整理一下最短路徑算法。會陸續的更新。。。 一、多源最短路算法——floyd算法 floyd算法主要用於求隨意兩點間的最短路徑。也成