UVa 10801 Lift Hopping (最短路+Dijkstra+建图)

来源:互联网 发布:java cs界面 类似于vs 编辑:程序博客网 时间:2024/06/04 20:09
#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<iostream>#include<queue>#include<vector>#include<set>#include<climits>#include<map>#include<string>using namespace std;const int INF=100000000;const int maxn=5+5;const int maxv=99+10;int n,k;int t[maxn];int cost[maxv][maxv];int d[maxv];bool used[maxv];int floors[maxv];int pos;//建无向图void Build_grah(int num){for(int i=0;i<pos;i++){for(int j=i;j<pos;j++){cost[floors[i]][floors[j]]=cost[floors[j]][floors[i]]=min(cost[floors[i]][floors[j]],abs(floors[i]-floors[j])*t[num]);}}}void Dijkstra(){fill(d,d+100,INF);fill(used,used+100,false);d[0]=0;while(true){int v=-1;for(int u=0;u<100;u++){if(!used[u]&&(v==-1||d[u]<d[v]))v=u;}if(v==-1)break;if(v==k)break;used[v]=true;for(int u=0;u<100;u++){d[u]=min(d[u],d[v]+cost[v][u]+60);}}}int main(){while(~scanf("%d%d",&n,&k)){for(int i=0;i<100;i++){fill(cost[i],cost[i]+100,INF);cost[i][i]=0;}for(int i=0;i<n;i++){scanf("%d",&t[i]);}for(int i=0;i<n;i++){memset(floors,0,sizeof(floors));pos=0;do{scanf("%d",&floors[pos++]);}while(getchar()!='\n');Build_grah(i);}Dijkstra();if(d[k]!=INF){if(k)printf("%d\n",d[k]-60);else printf("0\n");}else printf("IMPOSSIBLE\n");}return 0;}

0 0