最短路之SPFA(单源)HDU 2066
#include "iostream" #include "cstdio" #include "queue" #include <cstring> #include <string> #include "algorithm" using namespace std; #define Maxn 1005 #define inf 1<<29 int Map[Maxn][Maxn]; int vis[Maxn]; int dict[Maxn]; bool inq[Maxn]; int s[Maxn]; int e[Maxn]; int n; void Init() { for(int i=0;i<=Maxn;i++) { for(int j=0;j<=Maxn;j++) { if(i==j) Map[i][j]=0; else Map[i][j]=Map[j][i]=inf; } } } void build_map(int T) { for(int i=0;i<T;i++) { int a,b,time; scanf("%d%d%d",&a,&b,&time); n = max(max(n,a),b); if(time<Map[a][b]) Map[a][b]=Map[b][a]=time; } // cout<<n<<endl; } void spfa(int x,int n) { queue <int> Q; memset(vis, 0, sizeof(vis)); memset(inq, false, sizeof(inq)); for(int i=0;i<=n;i++) dict[i]=inf; dict[x]=0; inq[x]=true; Q.push(x); while (!Q.empty()) { int q=Q.front(); Q.pop(); //if(inq[q]==true) inq[q]=false; for(int i=0;i<=n;i++) { if(Map[q][i]<inf && dict[q]+Map[q][i]<dict[i]) { dict[i]=dict[q]+Map[q][i]; if(inq[i]==false) { Q.push(i); inq[i]=true; } } } } } int main() { int T,S,D; while(~scanf("%d%d%d",&T,&S,&D)) { n=0; Init(); build_map(T); int minn=inf; for(int i=0;i<S;i++) { scanf("%d",&s[i]); Map[0][s[i]]=Map[s[i]][0]=0; } int temp=0; for(int i=0;i<D;i++) { scanf("%d",&e[i]); } spfa(temp,n); /*for(int i=0;i<n;i++) cout<<dict[i]<<" "; */ for(int i=0;i<D;i++) minn=min(minn,dict[e[i]]); printf("%d\n",minn); } return 0; }