9
题解:为了节省时间,选择花费最少的时间的地方去旅行,从相邻的地方出发,可以从家到相邻的地方花费时间设为0
然后Dijistra找到从家到其他地方的最短时间,然后找出想去的地方的最短时间。
代码:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int maxx=1005; const int inf=0x3f3f3f3f; int T,S,D,n; int map[maxx][maxx];//存放关系 int s[maxx];//存放相邻的点 int e[maxx];//存放想去的地方 int vis[maxx];//是否访问 int ans[maxx];//存放最短距离 //Dijstra核心算法 inline void Dijstra() { int u,minn; memset(vis,0,sizeof(vis)); for(int i=0; i<=n; i++) ans[i]=map[0][i]; vis[0]=1; for(int i=1; i<=n; i++) { minn=inf; for(int j=1; j<=n; j++) { if(!vis[j]&&ans[j]<minn) { minn=ans[j]; u=j; } } vis[u]=1; for(int v=1; v<=n; v++) { if(map[u][v]<inf) { if(!vis[v]&&ans[v]>ans[u]+map[u][v]) ans[v]=ans[u]+map[u][v]; } } } } int main() { while(~scanf("%d%d%d",&T,&S,&D)) { n=0; for(int i=0; i<=1005; i++) { for(int j=0; j<=1005; j++) { if(i==j) map[i][j]=0; else map[i][j]=inf; } } while(T--) { int x,y ,z; scanf("%d%d%d",&x,&y,&z); n=max(max(n,x),y);///找到最大的那个点 if(map[x][y]>z) { map[x][y]=map[y][x]=z; } } for(int i=0; i<S; i++) { scanf("%d",&s[i]); map[0][s[i]]=map[s[i]][0]=0;///家到相邻点的距离为0 } for(int i=0; i<D; i++) { scanf("%d",&e[i]); } Dijstra(); int minn=inf; for(int i=0; i<D; i++) { minn=min(minn,ans[e[i]]);///找到想去的花费的最短时间 } printf("%d\n",minn); } return 0; }