hdoj1385_Minimum Transport Cost(多源最短路)

来源:互联网 发布:python multiply函数 编辑:程序博客网 时间:2024/05/21 10:01

思路: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;}
0 0