HDOJ 1385 Minimum Transport Cost
2014-10-15 17:28
381 查看
题意:给出邻接矩阵,与通过每一点的费用,求最短路径,并输出路径。若有多条,输出字典序最小的一条。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1385
思路:先用floyd算出最短路,再通过dfs求出字典序最小的路径。
注意点:必须字典序最小
以下为AC代码:
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1385
思路:先用floyd算出最短路,再通过dfs求出字典序最小的路径。
注意点:必须字典序最小
以下为AC代码:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
11878622 | 2014-10-15 17:31:56 | Accepted | 1385 | 62MS | 8272K | 3215 B | G++ | luminous11 |
#include <cstring> #include <iostream> #include <cstdio> #include <queue> #include <algorithm> #include <iomanip> #include <stack> #define MAXN 1005 using namespace std; int adj[MAXN][MAXN]; int path[MAXN][MAXN]; int pay[MAXN]; bool vis[MAXN]; int seq[MAXN]; bool flag; int n; int be; void dfs ( int tmp, int en, int num ) { if ( num > path[be][en] ) { return; } if ( tmp == en && num == path[be][en] ) { flag = true; return; } for ( int i = 1; i <= n; i ++ ) { if ( ! vis[i] ) { vis[i] = true; seq[i] = tmp; // cout << i << ' ' << seq[i] << ' ' << num << endl; if ( i == en ) { dfs ( i, en, num + adj[tmp][i] ); } else { dfs ( i, en, num + adj[tmp][i] + pay[i] ); } if ( flag ) { return; } vis[i] = false; } } } void print ( int en, int be ) { if ( en == be ) { cout << "Path: " << en; return; } print ( seq[en], be ); cout << "-->" << en; } void floyd( const int &n ) { for ( int i = 1; i <= n; i ++ ) { for ( int j = 1; j <= n; j ++ ) { for ( int k = 1; k <= n; k ++ ) { if ( path[j][k] > path[j][i] + path[i][k] + pay[i] ) { path[j][k] = path[j][i] + path[i][k] + pay[i]; } } } } } void test ( int n ) { for ( int i = 0; i <= n; i ++ ) { cout << seq[i] << ' '; } cout << endl; } int main() { ios::sync_with_stdio ( false ); while ( cin >> n && n ) { for ( int i = 1; i <= n; i ++ ) { for ( int j = 1; j <= n; j ++ ) { cin >> adj[i][j]; if ( adj[i][j] == -1 ) { adj[i][j] = 0x3f3f3f3f; } } } memcpy ( path, adj, sizeof ( adj ) ); for ( int i = 1; i <= n; i ++ ) { cin >> pay[i]; } floyd ( n ); int a, b; while ( cin >> a >> b ) { be = a; memset ( vis, 0, sizeof ( vis ) ); memset ( seq, 0, sizeof ( seq ) ); flag = false; vis[a] = true; if ( a == -1 && b == -1 ) { break; } if ( a == b ) { cout << "From " << a << " to " << b << " :" << endl; cout << "Path: " << a << endl; cout << "Total cost : " << path[b][a] << endl; cout << endl; continue; } dfs ( a, b, 0 ); cout << "From " << a << " to " << b << " :" << endl; print ( b, a ); cout << endl; cout << "Total cost : " << path[a][b] << endl; cout << endl; } } return 0; }
相关文章推荐
- HDOJ 1385 Minimum Transport Cost(dijkstar+字典路径||floyd+字典路径)
- HDOJ 1385 Minimum Transport Cost (Floyd + 打印字典序最小的路径)
- HDOJ1385(Minimum Transport Cost)
- hdoj 1385 Minimum Transport Cost
- hdoj1385_Minimum Transport Cost(多源最短路)
- ZOJ 1456 / HDOJ 1385 -- Minimum Transport Cost (FLoyd+路径字典序)
- hdoj 1385 Minimum Transport Cost(floyd 记录最短路径)
- hdoj 1385 Minimum Transport Cost【最短路-->floyd】
- HDOJ 1385 Minimum Transport Cost
- HDOJ 题目1385 Minimum Transport Cost(最短路,输出路径)
- Hdoj 1385 Minimum Transport Cost
- 【HDOJ】1385 Minimum Transport Cost
- HDOJ 1385 Minimum Transport Cost
- hdoj 1385 Minimum Transport Cost 【floyd + 路径记录】
- HDOJ--1385--Minimum Transport Cost(最短路记录路径)
- HDOJ 题目 1385 Minimum Transport Cost(最短路输出路径)
- HDU 1385 Minimum Transport Cost
- hdu 1385(zoj 1456)Minimum Transport Cost(最短路,输出路径,Floyd实现)
- 最短路 + 记录路径 之 zoj 1456 Minimum Transport Cost (hdu 1385)
- HDU 1385 Minimum Transport Cost