题意:n个电梯,100层楼,告诉每个电梯的速度和每个电梯会停的楼层数,起点在0层,终点是第k层,另外每次换乘需要等待60秒,问从0到k的最短时间是多少。
思路:这题就是读入比较蛋疼,然后根据输入建完图后跑一下Dijkstra。在更新时加入60秒。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #pragma comment (linker,"/STACK:102400000,102400000") #define pi acos(-1.0) #define eps 1e-6 #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r #define FRE(i,a,b) for(i = a; i <= b; i++) #define FREE(i,a,b) for(i = a; i >= b; i--) #define FRL(i,a,b) for(i = a; i < b; i++) #define FRLL(i,a,b) for(i = a; i > b; i--) #define mem(t, v) memset ((t) , v, sizeof(t)) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define DBG pf("Hi\n") typedef long long ll; using namespace std; #define INF 0x3f3f3f3f #define mod 1000000009 const int maxn = 105; const int MAXN = 3005; const int MAXM = 200010; const int N = 1005; int mp[maxn][maxn],TIME[6]; int dist[maxn]; bool vis[maxn]; int n,k; char str[MAXN]; int a[maxn]; int readLine(char *s) { int L; for (L=0;(s[L]=getchar())!='\n'&&s[L]!=EOF;L++) ; s[L]=0; return L; } void Dijkstra() { int i,j,now,mi; mem(dist,INF); mem(vis,false); for (i=0;i<100;i++) dist[i]=mp[0][i]; dist[0]=0; vis[0]=true; for (i=0;i<100;i++) { now=-1; mi=INF; for (j=0;j<100;j++) { if (!vis[j]&&mi>dist[j]) { now=j; mi=dist[j]; } } // printf("now=%d\n",now); if (now==-1) break; // DBG; vis[now]=true; for (j=0;j<100;j++) { if (!vis[j]&&dist[j]>dist[now]+mp[now][j]+60) dist[j]=dist[now]+mp[now][j]+60; } } // for (i=0;i<=30;i++) // pf("%d ",dist[i]); if (dist[k]>=INF) pf("IMPOSSIBLE\n"); else pf("%d\n",dist[k]); } int main() { #ifndef ONLINE_JUDGE freopen("C:/Users/lyf/Desktop/IN.txt","r",stdin); #endif int i,j; while (~sff(n,k)) { mem(mp,INF); for (i=0;i<n;i++) sf(TIME[i]); getchar(); for (i=0;i<n;i++) { readLine(str); int num=0,cnt=0; while (sscanf(str+num,"%d",&a[cnt])==1) { cnt++; while (str[num]&&str[num]==' ') num++; while (str[num]&&str[num]!=' ') num++; } // for (j=0;j<cnt;j++) // pf("%d ",a[j]); // cout<<endl; for (j=0;j<cnt;j++) for (int kk=j+1;kk<cnt;kk++) mp[a[j]][a[kk]]=mp[a[kk]][a[j]]=min(mp[a[kk]][a[j]],(a[kk]-a[j])*TIME[i]); } Dijkstra(); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-22 09:59:12