hdu 2992 Hotel booking
http://acm.hdu.edu.cn/showproblem.php?pid=2992
1 #include <cstdio> 2 #include <cstring> 3 #include <map> 4 #include <vector> 5 #include <queue> 6 #define maxn 200 7 #include <algorithm> 8 using namespace std; 9 10 const int inf=0x3fffffff; 11 12 struct node 13 { 14 int v,cost; 15 }; 16 int g[maxn][maxn],a[maxn],dis[20000]; 17 int n,m,k; 18 map<int,int>q; 19 vector<node>v[20000]; 20 bool vis[20000]; 21 int que[20000]; 22 23 void inti() 24 { 25 q.clear(); 26 for(int i=0; i<=n; i++) 27 { 28 v[i].clear(); 29 } 30 for(int i=0; i<=m+2; i++) 31 { 32 for(int j=0; j<=m+2; j++) 33 { 34 g[i][j]=inf; 35 if(i==j) g[i][j]=0; 36 } 37 } 38 } 39 40 void spfa(int qr) 41 { 42 queue<int>qq; 43 memset(vis,false,sizeof(vis)); 44 for(int i=1; i<=n; i++) dis[i]=inf; 45 dis[qr]=0; 46 qq.push(qr); 47 vis[qr]=true; 48 while(!qq.empty()) 49 { 50 int x=qq.front(); 51 qq.pop(); 52 vis[x]=false; 53 for(int i=0; i<(int)v[x].size(); i++) 54 { 55 int v2=v[x][i].v,cost=v[x][i].cost; 56 if(dis[v2]>dis[x]+cost) 57 { 58 dis[v2]=dis[x]+cost; 59 if(!vis[v2]) 60 { 61 vis[v2]=true; 62 qq.push(v2); 63 } 64 } 65 } 66 } 67 for(int i=1; i<=n; i++) 68 { 69 if(dis[i]<=600&&q[i]!=0) 70 { 71 g[q[qr]][q[i]]=1; 72 } 73 } 74 75 } 76 77 void floyd() 78 { 79 for(int c=0; c<=m+1; c++) 80 { 81 for(int i=0; i<=m+1; i++) 82 { 83 for(int j=0; j<=m+1; j++) 84 { 85 g[i][j]=min(g[i][j],g[i][c]+g[c][j]); 86 } 87 } 88 } 89 } 90 int main() 91 { 92 while(scanf("%d",&n)!=EOF) 93 { 94 if(n==0) break; 95 scanf("%d",&m); 96 inti(); 97 for(int i=1; i<=m; i++) 98 { 99 scanf("%d",&a[i]); 100 q[a[i]]=i; 101 } 102 a[0]=1; 103 q[1]=0; 104 a[m+1]=n; 105 q[n]=m+1; 106 scanf("%d",&k); 107 for(int i=0; i<k; i++) 108 { 109 int u,v1,cost; 110 scanf("%d%d%d",&u,&v1,&cost); 111 node st; 112 st.v=v1; 113 st.cost=cost; 114 node st1; 115 st1.v=u; 116 st1.cost=cost; 117 v[u].push_back(st); 118 v[v1].push_back(st1); 119 } 120 for(int i=0; i<=m; i++) 121 { 122 spfa(a[i]); 123 } 124 floyd(); 125 if(g[0][m+1]==inf) 126 { 127 printf("-1\n"); 128 } 129 else 130 printf("%d\n",g[0][m+1]-1); 131 } 132 return 0; 133 }