uva10801

来源:互联网 发布:网络会员制营销的概念 编辑:程序博客网 时间:2024/06/07 05:51

题意:

给出每个电梯每层用时以及可到达的楼,每换一个电梯就要加60s

思路:

本题用到floyd,权值要自己算出来(add函数)

代码:

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cmath>using namespace std;const int maxn = 105;const int inf = 10005;int n, k, t[maxn], f[maxn][maxn];int num[maxn];int flag;void add(int a, int b, int c) {f[a][b]  = f[b][a] = min(min(f[a][b], f[b][a]), abs(a-b)*c);}void deal() {for(int i=0; i<=flag; i++)for(int j=0; j<=flag; j++)for(int z=0; z<=flag; z++) {f[j][z] = min(f[j][z], f[j][i]+f[i][z]+60);}}int main() {while(scanf("%d%d", &n, &k) != EOF) {memset(f, inf, sizeof(f));for(int i=0; i<n; i++) {scanf("%d", &t[i]);}char ch;for(int i=0; i<n; i++) {ch = '\0';for(int j=0; ch != '\n'; j++) {scanf("%d%c", &num[j], &ch);flag = max(flag, num[j]);for(int k = 0; k<j; k++) {add(num[j], num[k], t[i]);}}}deal();if(k==0) printf("0\n");else if(f[0][k] < inf) printf("%d\n" ,f[0][k]);else printf("IMPOSSIBLE\n");}return 0;}


0 0