uva11374 Airport Express

来源:互联网 发布:淘宝旗舰店怎么开 编辑:程序博客网 时间:2024/05/01 21:33

这道题和hdu4081Qin Shi Huang's National Road System很像   都是需要枚举免费的那条路

主要是要两次预处理   一次是起点到任一点的最短路   再是终点到任一点的最短路

那么对于每一条免费路线(u, v)  答案便是dis[u](起点至u) + dis[v](终点到v) + w(u, v)


//#pragma warning (disable: 4786)//#pragma comment (linker, "/STACK:16777216")//HEAD#include <cstdio>#include <ctime>#include <cstdlib>#include <cstring>#include <queue>#include <string>#include <set>#include <stack>#include <map>#include <cmath>#include <vector>#include <iostream>#include <algorithm>using namespace std;//LOOP#define FF(i, a, b) for(int i = (a); i < (b); ++i)#define FD(i, b, a) for(int i = (b) - 1; i >= (a); --i)#define FE(i, a, b) for(int i = (a); i <= (b); ++i)#define FED(i, b, a) for(int i = (b); i>= (a); --i)#define REP(i, N) for(int i = 0; i < (N); ++i)#define CLR(A,value) memset(A,value,sizeof(A))#define CPY(a, b) memcpy(a, b, sizeof(a))#define FC(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)//STL#define SZ(V) (int)V.size()#define PB push_back#define EQ(a, b) (fabs((a) - (b)) <= 1e-10)#define ALL(c) (c).begin(), (c).end()//INPUT#define RI(n) scanf("%d", &n)#define RII(n, m) scanf("%d%d", &n, &m)#define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)#define RIV(n, m, k, p) scanf("%d%d%d%d", &n, &m, &k, &p)#define RV(n, m, k, p, q) scanf("%d%d%d%d%d", &n, &m, &k, &p, &q)#define RS(s) scanf("%s", s)//OUTPUT#define WI(n) printf("%d\n", n)#define WS(s) printf("%s\n", s)typedef long long LL;typedef unsigned long long ULL;typedef vector <int> VI;const int INF = 100000000;const double eps = 1e-10;const int MAXN = 550;struct Edge{    int from, to, dist;};struct Node{    int d, u;    bool operator < (const Node& rhs) const    {        return d > rhs.d;    }};struct Dijkstra{    int n, m;    vector<Edge> edges;    vector<int> G[MAXN];    bool done[MAXN];    int d[MAXN];    int p[MAXN];    void init(int n)    {        this->n = n;        for (int i = 0; i < n; i++)            G[i].clear();        edges.clear();    }    void addedge(int from, int to, int dist)    {        edges.push_back((Edge){from, to, dist});        m = edges.size();        G[from].push_back(m - 1);    }    void dijkstra(int s)    {        priority_queue<Node> Q;        for (int i = 0; i < n; i++)            d[i] = INF;        d[s] = 0;        memset(done, 0, sizeof(done));        Q.push((Node){0, s});        while (!Q.empty())        {            Node x = Q.top();            Q.pop();            int u = x.u;            if (done[u])                continue;            done[u] = 1;            for (int i = 0; i < G[u].size(); i++)            {                Edge& e = edges[G[u][i]];                if (d[e.to] > d[u] + e.dist)                {                    d[e.to] = d[u] + e.dist;                    p[e.to] = G[u][i];                    Q.push((Node){d[e.to], e.to});                }            }        }    }}dij;vector<Edge> ee;int n, s, e, m, k;int ds[MAXN], de[MAXN];int ps[MAXN];void printS(int u){    if (u == s)    {        printf("%d", s + 1);        return;    }    printS(dij.edges[ps[u]].from);    printf(" %d", u + 1);}void printE(int u){    if (u == e)    {        printf(" %d\n", e + 1);        return;    }    printf(" %d", u + 1);    printE(dij.edges[dij.p[u]].from);}int main(){    int x, y, z;    int kase = 0;    while (~RIII(n, s, e))    {        if (kase++)            puts("");        dij.init(n);        ee.clear();        CLR(ds, 0), CLR(de, 0);        RI(m);        REP(i, m)        {            RIII(x, y, z);            x--, y--;            dij.addedge(x, y, z);            dij.addedge(y, x, z);        }        RI(k);        REP(i, k)        {            RIII(x, y, z);            x--, y--;            ee.PB((Edge){x, y, z});            ee.PB((Edge){y, x, z});        }        s--, e--;        dij.dijkstra(s);        int ans = dij.d[e];        REP(i, n)        {            ds[i] = dij.d[i];            ps[i] = dij.p[i];        }        dij.dijkstra(e);        REP(i, n)            de[i] = dij.d[i];        int flag = -1;        REP(i, SZ(ee))        {            int u = ee[i].from, v = ee[i].to, w = ee[i].dist;            if (ds[u] + w + de[v] < ans)            {                flag = i;                ans = ds[u] + de[v] + w;            }        }        if (flag == -1)        {            printS(e);            puts("\nTicket Not Used");            WI(ans);            continue;        }        printS(ee[flag].from);        printE(ee[flag].to);        WI(ee[flag].from + 1);        WI(ans);    }}


原创粉丝点击