UVA11374 Airport Express --- dijstra

预处理单源最短路径,计算到s,e的最短路径d[s],d[e],然后枚举所有商务线,两点为u,v,边长cos,则走商务线最短路径是ds[s]+cos+de[e]..

    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    const int maxn = 2010;
    const int INF = 0x3f3f3f3f;
    struct Edge {
        int from,to,dist;
    } edges[maxn*2];
    int dis[maxn],dis_s[maxn];
    int pre[maxn],pre_s[maxn];
    bool done[maxn];
    vector G[maxn];
    int index_;
    int n,s,e;
    int m,k;
    struct Node {
        int u,d;
        bool operator < (const Node &n) const {
            return d > n.d;
        }
    };

    void add_edge(int from,int to,int dist) {
        G[from].push_back(index_);
        edges[index_++] = (Edge){from,to,dist};
    }

    void dijkstra(int s) {
        priority_queue q;
        for(int i = 0;i < maxn;i++) dis[i] = INF;
        memset(done,0,sizeof(done));
        memset(pre,0,sizeof(pre));
        q.push((Node){s,0});
        dis[s] = 0;
        pre[s] = -1;
        while(!q.empty()) {
            Node cur = q.top();
            q.pop();
            if(done[cur.u]) continue;
            done[cur.u] = true;
            for(int i = 0;i < G[cur.u].size();i++) {
                Edge e = edges[G[cur.u][i]];
                if(dis[e.to] > dis[cur.u]+e.dist) {
                    dis[e.to] = dis[cur.u]+e.dist;
                    pre[e.to] = cur.u;
                    q.push((Node){e.to,dis[e.to]});
                }
            }
        }
    }

    void dfs(int e,int s) {
        if(e == s) {
            printf("%d",s);
            return;
        }
        dfs(pre_s[e],s);
        printf(" %d",e);
    }

    void dfs_(int e,int s) {
        while(true) {
            printf("%d",s);
            if(s==e) {
                printf("\n");
                break;
            } else {
                printf(" ");
            }
            s = pre[s];
            
        }
    }

    Edge t[maxn*2];

    int main() {
    // freopen("out.txt","w",stdout);
        int kase = 1;
        while(scanf("%d%d%d",&n,&s,&e) != EOF) {
            if(kase++ != 1) printf("\n");
            for(int i = 0;i < n;i++) G[i].clear();
            memset(done,0,sizeof(done));
            for(int i = 0;i < maxn;i++) dis[i] = INF;
            index_ = 0;
            scanf("%d",&m);
            int x,y,z;
            for(int i = 0;i < m;i++) {
                scanf("%d%d%d",&x,&y,&z);
                add_edge(x,y,z);
                add_edge(y,x,z);
            }
            dijkstra(s);
            memcpy(dis_s,dis,sizeof(dis));
            memcpy(pre_s,pre,sizeof(pre));
            dijkstra(e);
            scanf("%d",&k);
            
            int t_n = 0;
            memset(t,0,sizeof(t));
            for(int i = 0;i < k;i++) {
                scanf("%d%d%d",&x,&y,&z);
                t[t_n++] = (Edge){x,y,z};
                t[t_n++] = (Edge){y,x,z};
            }
            int res = dis[s];
            bool used = false;
            int station1 = -1;
            int station2 = -1;
            
            for(int i = 0;i < t_n;i++) {
                Edge e = t[i];
                if(res > dis_s[e.from]+t[i].dist+dis[e.to]) {
                    used = true;
                    res = dis_s[e.from]+t[i].dist+dis[e.to];
                    station1 = e.from;
                    station2 = e.to;
                }
            }
            if(!used) {
                dfs(e,s);
                printf("\n");
                printf("Ticket Not Used\n");
                printf("%d\n",res);
            } else {
                dfs(station1,s);
                printf(" ");
                dfs_(e,station2);
                printf("%d\n",station1);
                printf("%d\n",res);
            }
        }

        return 0;
    }

 

你可能感兴趣的:(图论)