hdu-3790最短路径问题
生活随笔
收集整理的這篇文章主要介紹了
hdu-3790最短路径问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Problem Description 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。
(1<n<=1000, 0<m<100000, s != t)
思路: 做這個題目首先一定要搞清楚一點————我們首先要求的還是最短的距離,其次再是最少的花費。 我們可以把這個要求分成兩塊來完成,第一部分是求出一條最短路徑的花費,不用管這個花費是不是最少的,就是按照原來的模式求即可;第二部分,我們要做的就是詳細的考慮下這個題目的特殊要求,因為要求的是最短路徑,所以在原來的基礎上只有兩種可能性,比原來小的就繼續更新Cost,和原來相等的也看看可不可以繼續更新Cost 再就是輸入的數據的時候要注意一點:無論是dis還是cost,都要注意當前接受的是否是最小值
#include <iostream> #include <cstring> #include <cstdio> #define maxn 1007 #define INF 65535 using namespace std;int start,e; int n,m; int map[maxn][maxn]; int cost[maxn][maxn];void Dijkstra() {int v,Min,vis[maxn];int d[maxn],c[maxn];for(int i = 1;i <= n;i++) {d[i] = map[start][i];c[i] = cost[start][i];}memset(vis,0,sizeof(vis));vis[start] = 1;for(int i = 1;i <= n;i++){if(vis[e]) break;Min = INF;for(int j = 1;j <= n;j++) if(!vis[j] && d[j]<Min)Min = d[v=j];vis[v] = 1;for(int j = 1;j <= n;j++) if(!vis[j] && map[v][j]<INF) {if(d[j] > d[v]+map[v][j]) {d[j] = d[v]+map[v][j];c[j] = c[v]+cost[v][j];}else if(d[j] == d[v]+map[v][j]) if(c[j] > c[v]+cost[v][j])c[j] = c[v]+cost[v][j];}}printf("%d %d\n",d[e],c[e]); }int main() {while(scanf("%d%d",&n,&m) && n+m){for(int i = 1;i <= n;i++)for(int j = 1;j <= n;j++) {map[i][j] = i==j?0:INF;cost[i][j] = i==j?0:INF;}int a,b,c,d;for(int i = 1;i <= m;i++){scanf("%d%d%d%d",&a,&b,&c,&d);if(map[a][b]>c){map[a][b]=map[b][a]=c;cost[a][b]=cost[b][a]=d;}else if(map[a][b]==c){if(cost[a][b]>d)cost[a][b]=cost[b][a]=d;}}scanf("%d%d",&start,&e);Dijkstra();}return 0; }
?
Input 輸入n,m,點的編號是1~n,然后是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最后一行是兩個數 s,t;起點s,終點。n和m為0時輸入結束。(1<n<=1000, 0<m<100000, s != t)
?
Output 輸出 一行有兩個數, 最短距離及其花費。?
Sample Input 3 2 1 2 5 6 2 3 4 5 1 3 0 0?
Sample Output 9 11思路: 做這個題目首先一定要搞清楚一點————我們首先要求的還是最短的距離,其次再是最少的花費。 我們可以把這個要求分成兩塊來完成,第一部分是求出一條最短路徑的花費,不用管這個花費是不是最少的,就是按照原來的模式求即可;第二部分,我們要做的就是詳細的考慮下這個題目的特殊要求,因為要求的是最短路徑,所以在原來的基礎上只有兩種可能性,比原來小的就繼續更新Cost,和原來相等的也看看可不可以繼續更新Cost 再就是輸入的數據的時候要注意一點:無論是dis還是cost,都要注意當前接受的是否是最小值
#include <iostream> #include <cstring> #include <cstdio> #define maxn 1007 #define INF 65535 using namespace std;int start,e; int n,m; int map[maxn][maxn]; int cost[maxn][maxn];void Dijkstra() {int v,Min,vis[maxn];int d[maxn],c[maxn];for(int i = 1;i <= n;i++) {d[i] = map[start][i];c[i] = cost[start][i];}memset(vis,0,sizeof(vis));vis[start] = 1;for(int i = 1;i <= n;i++){if(vis[e]) break;Min = INF;for(int j = 1;j <= n;j++) if(!vis[j] && d[j]<Min)Min = d[v=j];vis[v] = 1;for(int j = 1;j <= n;j++) if(!vis[j] && map[v][j]<INF) {if(d[j] > d[v]+map[v][j]) {d[j] = d[v]+map[v][j];c[j] = c[v]+cost[v][j];}else if(d[j] == d[v]+map[v][j]) if(c[j] > c[v]+cost[v][j])c[j] = c[v]+cost[v][j];}}printf("%d %d\n",d[e],c[e]); }int main() {while(scanf("%d%d",&n,&m) && n+m){for(int i = 1;i <= n;i++)for(int j = 1;j <= n;j++) {map[i][j] = i==j?0:INF;cost[i][j] = i==j?0:INF;}int a,b,c,d;for(int i = 1;i <= m;i++){scanf("%d%d%d%d",&a,&b,&c,&d);if(map[a][b]>c){map[a][b]=map[b][a]=c;cost[a][b]=cost[b][a]=d;}else if(map[a][b]==c){if(cost[a][b]>d)cost[a][b]=cost[b][a]=d;}}scanf("%d%d",&start,&e);Dijkstra();}return 0; }
轉載于:https://www.cnblogs.com/immortal-worm/p/5185053.html
總結
以上是生活随笔為你收集整理的hdu-3790最短路径问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详谈分布式系统缓存的设计细节
- 下一篇: MySQL运维实战系列:MySQL5.7