思路:floyd
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> pathcost[10000];
vector<int> pre[10000];
vector<int> cost[10000];
vector<int> citycost;
void floyd(int n)
{
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
if (cost[i][j] > cost[i][k] + cost[k][j] + citycost[k])
{
cost[i][j] = cost[i][k] + cost[k][j] + citycost[k];
pre[i][j] = pre[i][k];
}
else if (cost[i][j] == cost[i][k] + cost[k][j] + citycost[k])
{
if (pre[i][j] > pre[i][k])
{
pre[i][j] = pre[i][k];
}
}
}
}
void solve(int s, int d)
{
int inis = s, inid = d;
s -= 1;
d -= 1;
vector<int> v;
v.clear();
v.push_back(s);
while (pre[s][d]!=d)
{
v.push_back(pre[s][d]);
s = pre[s][d];
}
v.push_back(d);
cout << "From "<<inis<<" to "<<inid<<" :" << endl;
cout << "Path: ";
if (inis == inid)
cout << inis;
else{
for (int i = 0; i < v.size(); i++)
{
cout << v[i] + 1;
if (i < v.size() - 1)
cout << "-->";
}
}
cout << endl;
cout << "Total cost : " <<cost[inis-1][inid-1] << endl;
}
int main()
{
int n;
while (cin >> n&&n)
{
for (int i = 0; i < n; i++)
{
pre[i].clear();
pathcost[i].clear();
cost[i].clear();
}
citycost.clear();
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
int tpc;
cin >> tpc;
pathcost[i].push_back(tpc);
if (pathcost[i][j] != -1)
cost[i].push_back(tpc);
else
cost[i].push_back(99999999);
pre[i].push_back(j);
}
for (int i = 0; i < n; i++)
{
int tcc;
cin >> tcc;
citycost.push_back(tcc);
}
floyd(n);
int s, d;
while (cin >> s >> d&&s != -1)
{
solve(s, d);
cout << endl;
}
}
return 0;
}