Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define IMPOSSIVEL 0x3f3f3f3f
- int best[500];
- bool visited[500];
- int n;
- int matriz[500][500];
- int matrizT[500][500];
- void dijkstra(int s) {
- memset(best, 0x3f, sizeof(best));
- memset(visited, false, sizeof(visited));
- best[s] = 0;
- while (true) {
- int x = -1, menor = IMPOSSIVEL;
- for (int k = 0; k < n; k++) {
- if (best[k] < menor && !visited[k]) {
- x = k;
- menor = best[x];
- }
- }
- if(x == -1) break;
- // cout << "next " << x << " - " << best[x] << endl;
- visited[x] = true;
- for (int i = 0; i < n; i++) {
- if (matriz[x][i] == 0)
- continue;
- if (best[x] + matriz[x][i] < best[i]) {
- best[i] = best[x] + matriz[x][i];
- }
- }
- }
- }
- void dfs(int u) {
- visited[u] = true;
- for (int i = 0; i< n; i++) {
- if (matrizT[u][i] == 0)
- continue;
- if (best[i] == best[u] - matrizT[u][i]) {
- matriz[i][u] = 0;
- if (!visited[i])
- dfs(i);
- }
- }
- }
- int main(int argc, char const *argv[])
- {
- for (;;) {
- int m;
- cin >> n >> m;
- if (n == 0 && m == 0)
- break;
- int s, d;
- cin >> s >> d;
- memset(matriz, 0, sizeof(matriz));
- memset(matrizT, 0, sizeof(matrizT));
- for(int i = 0; i < m; i++) {
- int u,v,p;
- cin >> u >> v >> p;
- matriz[u][v] = p;
- matrizT[v][u] = p;
- }
- dijkstra(s);
- if (best[d] == IMPOSSIVEL) {
- cout << "-1" << endl;
- return 0;
- }
- memset(visited, false, sizeof(visited));
- visited[s] = true;
- dfs(d);
- dijkstra(s);
- if (best[d] == IMPOSSIVEL)
- cout << "-1" << endl;
- else
- cout << best[d] << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement