您的位置:首页 > 其它

HDOJ 1385 Minimum Transport Cost

2014-10-15 17:28 381 查看
题意:给出邻接矩阵,与通过每一点的费用,求最短路径,并输出路径。若有多条,输出字典序最小的一条。

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1385

思路:先用floyd算出最短路,再通过dfs求出字典序最小的路径。

注意点:必须字典序最小

以下为AC代码:

Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor
118786222014-10-15 17:31:56Accepted138562MS8272K3215 BG++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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: