UVA11374最短路模板

来源:互联网 发布:淘宝折扣店是真的吗 编辑:程序博客网 时间:2024/05/02 01:11

蓝书p329

lrj模板

// UVa11374 Airport Express// Rujia Liu#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int INF = 1000000000;const int maxn = 500 + 10;struct Edge {  int from, to, dist;};struct HeapNode {  int d, u;  bool operator < (const HeapNode& rhs) const {    return d > rhs.d;  }};struct Dijkstra {  int n, m;  vector<Edge> edges;  vector<int> G[maxn];  bool done[maxn];    // 是否已永久标号  int d[maxn];        // s到各个点的距离  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<HeapNode> Q;    for(int i = 0; i < n; i++) d[i] = INF;    d[s] = 0;    memset(done, 0, sizeof(done));    Q.push((HeapNode){0, s});    while(!Q.empty()) {      HeapNode x = Q.top(); Q.pop();      int u = x.u;      if(done[u]) continue;      done[u] = true;      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((HeapNode){d[e.to], e.to});        }      }    }  }  // dist[i]为s到i的距离,paths[i]为s到i的最短路径(经过的结点列表,包括s和t)  void GetShortestPaths(int s, int* dist, vector<int>* paths) {    dijkstra(s);    for(int i = 0; i < n; i++) {      dist[i] = d[i];      paths[i].clear();      int t = i;      paths[i].push_back(t);      while(t != s) {        paths[i].push_back(edges[p[t]].from);        t = edges[p[t]].from;      }      reverse(paths[i].begin(), paths[i].end());    }  }};//////// 题目相关Dijkstra solver;int d1[maxn], d2[maxn];vector<int> paths1[maxn], paths2[maxn];int main() {  int kase = 0, N, S, E, M, K, X, Y, Z;  while(scanf("%d%d%d%d", &N, &S, &E, &M) == 4) {    solver.init(N);    S--; E--; // 编号从0~N-1    for(int i = 0; i < M; i++) {      scanf("%d%d%d", &X, &Y, &Z); X--; Y--;      solver.AddEdge(X, Y, Z);      solver.AddEdge(Y, X, Z);    }    solver.GetShortestPaths(S, d1, paths1); // S到所有点的距离和路径    solver.GetShortestPaths(E, d2, paths2); // T到所有点的距离和路径    int ans = d1[E];              // 初始解解为直达距离    vector<int> path = paths1[E]; // 初始解的station序列    int midpoint = -1;            // 不坐商业线    scanf("%d", &K);    for(int i = 0; i < K; i++) {      scanf("%d%d%d", &X, &Y, &Z); X--; Y--;      for(int j = 0; j < 2; j++) { // j=0代表商业线坐X->Y,j=1代表Y->X        if(d1[X] + d2[Y] + Z < ans) {          ans = d1[X] + d2[Y] + Z;          path = paths1[X];          for(int j = paths2[Y].size()-1; j >= 0; j--) // 从Y到T的距离要反过来            path.push_back(paths2[Y][j]);          midpoint = X;        }        swap(X, Y);      }    }    if(kase != 0) printf("\n");    kase++;    for(int i = 0; i < path.size()-1; i++) printf("%d ", path[i]+1);    printf("%d\n", E+1);    if(midpoint == -1) printf("Ticket Not Used\n"); else printf("%d\n", midpoint+1);    printf("%d\n", ans);  }  return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2岁半宝宝太调皮怎么办 2岁宝宝晚上睡觉晚怎么办 三周岁半宝宝入园后不合群怎么办 数学懒于思考的孩子怎么办 2岁宝宝爱哭不讲道理怎么办 孩子不讲道理一直哭怎么办 白天不烧晚上烧怎么办 两岁宝宝出虚汗怎么办 两岁宝宝出水痘怎么办 两岁宝宝爱看手机怎么办 两岁宝宝太好动怎么办 五岁宝宝不会数数怎么办 四岁宝宝算数不好怎么办 两个月宝宝体内有火怎么办 两个月宝宝有火怎么办 2岁宝宝起眼屎怎么办 一周岁的宝宝皮肤过敏怎么办 两岁宝宝脾气倔不听话怎么办 22个月宝宝打人怎么办 两岁宝宝会打人怎么办 3岁哭闹倔强不止怎么办 我儿子二十三岁不爱说话怎么办 2岁宝宝不听话脾气大怎么办 2岁宝宝调皮不听话怎么办 2岁的宝宝不听话怎么办 2岁宝宝总是不听话怎么办 2岁宝宝淘气不听话怎么办 两岁宝宝不听大人的话怎么办? 来月经奶量减少怎么办 月经来了奶少怎么办 来例假奶水少了怎么办 两岁宝宝吐口水怎么办 3岁宝宝不愿自己吃饭怎么办 婆家的人很烦人怎么办 三十了还没结婚怎么办 两岁宝贝断奶粉怎么办 宝宝断了母乳不吃奶粉怎么办 一岁宝宝不爱吃辅食怎么办 断奶后宝宝抗拒奶瓶怎么办 两岁宝宝断奶后不喝奶粉怎么办 两岁宝宝断奶不吃奶粉怎么办