zoukankan      html  css  js  c++  java
  • HDU 2680 Choose the best route(多起点单终点最短路问题)题解

    题意:小A要乘车到s车站,他有w个起始车站可选,问最短时间。

    思路:用Floyd超时,Dijkstra遍历,但是也超时。仔细看看你会发现这道题目好像是多源点单终点问题,终点已经确定,那么我们可以直接转置邻接矩阵,从终点找最小的起点,转换成了单源最短路问题。

    代码:

    #include<cstdio>
    #include<set>
    #include<cmath>
    #include<stack>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const int maxn = 1000+5;
    const int INF = 0x3f3f3f3f;
    int mp[maxn][maxn];
    int dis[maxn];
    int vis[maxn];
    int n,m;
    void dijkstra(int st){
        memset(vis,0,sizeof(vis));
        memset(dis,INF,sizeof(dis));
        dis[st] = 0;
        for(int i = 1;i <= n;i++){
            int Min = INF,k = 0;
            for(int j = 1;j <= n;j++){
                if(!vis[j] &&  dis[j] < Min){
                    Min = dis[j];
                    k = j;
                }
            }
            vis[k] = 1;
            for(int j = 1;j <= n;j++){
                if(dis[j] > dis[k] + mp[k][j]){
                    dis[j] = dis[k] + mp[k][j];
                }
            }
        }
    }
    
    
    int main(){
        int s;
        while(scanf("%d%d%d",&n,&m,&s) != EOF){
            memset(mp,INF,sizeof(mp));
            while(m--){
                int u,v,w;
                scanf("%d%d%d",&u,&v,&w);
                mp[v][u] = min(mp[v][u],w);
            }
            dijkstra(s);
            int ans = INF;
            scanf("%d",&m);
            while(m--){
                int u;
                scanf("%d",&u);
                ans = min(ans,dis[u]);
            }
            if(ans == INF) printf("-1
    ");
            else printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    简单 dp 题选做
    UVa11327
    Codeforces Round #641 (div.2) 题解
    新博客
    数位dp的学习
    stl粗略用法
    cf437C The Child and Toy
    poj1995 Raising Modulo Numbers
    Tarjan的学习
    最短路模板
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9415457.html
Copyright © 2011-2022 走看看