题意:小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; }