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\n");
        else printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/KirinSB/p/9415457.html