生活随笔
收集整理的這篇文章主要介紹了
数据结构实验之图论七:驴友计划(最短路Floyd/Dijkstra)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Description
做為一個(gè)資深驢友,小新有一張珍藏的自駕游線(xiàn)路圖,圖上詳細(xì)的標(biāo)注了全國(guó)各個(gè)城市之間的高速公路距離和公路收費(fèi)情況,現(xiàn)在請(qǐng)你編寫(xiě)一個(gè)程序,找出一條出發(fā)地到目的地之間的最短路徑,如果有多條路徑最短,則輸出過(guò)路費(fèi)最少的一條路徑。
Input
連續(xù)T組數(shù)據(jù)輸入,每組輸入數(shù)據(jù)的第一行給出四個(gè)正整數(shù)N,M,s,d,其中N(2 <= N <= 500)是城市數(shù)目,城市編號(hào)從0~N-1,M是城市間高速公路的條數(shù),s是出發(fā)地的城市編號(hào),d是目的地的城市編號(hào);隨后M行,每行給出一條高速公路的信息,表示城市1、城市2、高速公路長(zhǎng)度、收費(fèi)額,中間以空格間隔,數(shù)字均為整數(shù)且不超過(guò)500,輸入數(shù)據(jù)均保證有解。
Output
在同一行中輸出路徑長(zhǎng)度和收費(fèi)總額,數(shù)據(jù)間用空格間隔。
Sample
Input
1
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
Output
3 40
Hint
本文提供多個(gè)解析選擇適合自己的食用!
Floyd - Warshall(弗洛伊德算法、啊哈算法)
啊哈算法中的Dijkstra算法
ACM_最短路講解
#include<bits/stdc++.h>using namespace std
;#define INF 0x3f3f3f3f
const int N
= 555;int G
[N
][N
];
int P
[N
][N
];
void init(int n
)
{for(int i
= 0; i
< n
; i
++){for(int j
= 0; j
< n
; j
++){if(i
== j
)G
[i
][j
] = 0;elseG
[i
][j
] = INF
;}}
}
void Floyd(int n
, int s
, int d
)
{for(int k
= 0; k
< n
; k
++){for(int i
= 0; i
< n
; i
++){for(int j
= 0; j
< n
; j
++){if(G
[i
][j
] > G
[i
][k
] + G
[k
][j
]){G
[i
][j
] = G
[i
][k
] + G
[k
][j
];P
[i
][j
] = P
[i
][k
] + P
[k
][j
];}else if(G
[i
][j
] == G
[i
][k
] + G
[k
][j
]){P
[i
][j
] = min(P
[i
][j
], P
[i
][k
] + P
[k
][j
]);}}}}cout
<< G
[s
][d
] << ' ' << P
[s
][d
] << endl
;
}
int main()
{int t
;cin
>> t
;while(t
--){int n
, m
, s
, d
;cin
>> n
>> m
>> s
>> d
;init(n
);while(m
--){int u
, v
, len
, value
;cin
>> u
>> v
>> len
>> value
;G
[u
][v
] = G
[v
][u
] = len
;P
[u
][v
] = P
[v
][u
] = value
;}Floyd(n
, s
, d
);}return 0;
}
#include<bits/stdc++.h>using namespace std
;#define INF 0x3f3f3f3fconst int N
= 550;
int mp
[N
][N
];
int book
[N
];
int money
[N
][N
];int dist
[N
];
int mon
[N
];void Dijkstra(int n
, int s
, int d
)
{int i
, j
, v
, minn
, u
= 0;for(i
= 0; i
< n
; i
++){dist
[i
] = mp
[s
][i
];mon
[i
] = money
[s
][i
];}dist
[s
] = 0;book
[s
] = 1;mon
[s
] = 0;for(i
= 1; i
< n
; i
++){minn
= INF
;for(j
= 0; j
< n
; j
++){if(minn
> dist
[j
] && !book
[j
]){minn
= dist
[j
];u
= j
;}}book
[u
] = 1;for(v
= 0; v
< n
; v
++){if(mp
[u
][v
] < INF
&& ! book
[v
]){if(dist
[v
] > dist
[u
] + mp
[u
][v
]){dist
[v
] = dist
[u
] + mp
[u
][v
];mon
[v
] = mon
[u
] + money
[u
][v
];}else if(dist
[v
] == dist
[u
] + mp
[u
][v
]){if(mon
[v
] > mon
[u
] + money
[u
][v
]){mon
[v
] = mon
[u
] + money
[u
][v
];}}}}}cout
<< dist
[d
] << ' ' << mon
[d
] << endl
;
}int main()
{int t
, u
, v
, n
, m
, s
, d
, len
, cost
;scanf("%d", &t
);while(t
--){scanf("%d %d %d %d",&n
,& m
, &s
, &d
);memset(book
, 0, sizeof(book
));memset(mp
, INF
, sizeof(mp
));for(int i
= 0; i
< n
;i
++){mp
[i
][i
] = 0;}while(m
--){scanf("%d %d %d %d",&u
, &v
, &len
, &cost
);mp
[u
][v
] = mp
[v
][u
] = len
;money
[u
][v
] = money
[v
][u
] = cost
;}Dijkstra(n
, s
, d
);}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的数据结构实验之图论七:驴友计划(最短路Floyd/Dijkstra)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。