题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066
题目分类:dijkstra算法
错误点:不知道点的范围
代码:
#include<bits/stdc++.h> using namespace std; #define INF 10000000 const int maxv=2000; int cost[maxv][maxv]; int d[maxv]; bool vis[maxv]; int x[2000]; int y[2000]; int path[2000]; int e,s,di; int a,b,tt; int ans; int ver; void dijkstra(int n,int st) { int i,j,minn,pre; memset(vis,0,sizeof(vis)); vis[st]=1; for(i=0;i<n;i++) { d[i]=cost[st][i]; path[i]=st; } d[st]=0; path[st]=-1; pre=st; for(i=1;i<n;i++) { for(j=1;j<n;j++) { if(vis[j]==0&&d[pre]+cost[pre][j]<d[j]) d[j]=d[pre]+cost[pre][j],path[j]=pre; } minn=INF; for(j=1;j<n;j++) { if(vis[j]==0&&d[j]<minn) minn=d[j],pre=j; } vis[pre]=1; } return ; } int main() { while(scanf("%d %d %d",&e,&s,&di)!=EOF) { for(int i=0;i<1200;i++) { for(int j=0;j<1200;j++) { cost[i][j]=INF; } cost[i][i]=0; } ver=0; for(int i=0;i<e;i++) { scanf("%d %d %d",&a,&b,&tt); cost[a][b]=min(tt,cost[a][b]); cost[b][a]=min(tt,cost[a][b]); ver=max(max(ver,a),b); } for(int i=0;i<s;i++) { scanf("%d",&x[i]); cost[0][x[i]]=0; cost[x[i]][0]=0; } for(int i=0;i<di;i++) { scanf("%d",&y[i]); } ans=INF; dijkstra(ver+1,0); for(int j=0;j<di;j++) { ans=min(ans,d[y[j]]); } printf("%d ",ans); } return 0; }