题意:给出邻接矩阵,与通过每一点的费用,求最短路径,并输出路径。若有多条,输出字典序最小的一条。
链接: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;
}