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

2021-07-10 10:00:48 字數 1653 閱讀 6677

題目描述:給你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輸出:輸出 一行有兩個數, 最短距離及其花費。

樣例輸入:

3 2

1 2 5 6

2 3 4 5

1 30 0

樣例輸出:9 11

[解題思路]

構造無向圖,運用dijkstra演算法求最短路徑,在求最短路徑的同時求出最小花費(注意重邊)。

消除重邊影響的**如下

for(i=1;i<=m;i++)

}

本題目所運用的dijkstra演算法的改動版本為:

void dijkstra()

}dist[s]=0;

mon[s]=0;

while(l!=null)

/**如果有相同長度的路徑,花費選擇較少的那個

*/else if(dist[m]+map[m][j]==dist[j]&&mon[m]+cost[m][j]

所以該題的源**如下:

#include#include#include#define r 1001

#define c 1001

#define max 10000000

typedef struct node* link;

struct node;

link l;

int m,n,s,e;

int map[r][c];

int count;

int dist[r],mon[r],cost[r][c];

bool visited[r]=;

//int sum[r]=;

void insert(int x)

else

return;

}int getmin()

else

r=q;

q=q->next;

}int x=p->e;

if(p==l)

else

return x;

}}void dijkstra()

}dist[s]=0;

mon[s]=0;

while(l!=null)

/**如果有相同長度的路徑,花費選擇較少的那個

*/else if(dist[m]+map[m][j]==dist[j]&&mon[m]+cost[m][j]w||(map[s][e]==w&&cost[s][e]>c))

}scanf("%d %d",&s,&e);

dijkstra();

printf("%d %d\n",dist[e],mon[e]);

free(l);

l=null;

}}

[題目**]

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

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

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

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

九度OJ 1008 最短路徑問題

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