UVa 10801 Lift Hopping / floyd

乘电梯 求到目标层的最短时间 有n个电梯 换一个电梯乘需要额外60秒

所以建图时每个电梯自己能到的层数先把时间算好 这是不需要60秒的

然后做floyd时 如果松弛 肯定是要换电梯 所以要加60秒

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <algorithm>

#include <cmath>

#include <cstdlib>

using namespace std;

int a[110][110];

int b[110];

int n,m;



void floyd()

{

	int i,j,k;

	for(k = 0;k <= 100; k++)

			for(i = 0;i <= 100; i++)

				for(j = 0;j <= 100; j++)

						a[i][j] = min(a[i][j],a[i][k]+a[k][j]+60);



}

int main()

{

	int t,n,i,j,k;

	while(scanf("%d %d",&n,&m)!=EOF)

	{

		//for(k = 1;k <= n; k++)

		for(i = 0;i <= 100; i++)

			for(j = 0;j <= 100; j++)

			{

				if(i == j)

					a[i][j] = 0;

				else

					a[i][j] = 999999999;

			}

		for(i = 0; i < n; i++)

			scanf("%d",&b[i]);

		getchar();

		for(i = 0; i < n; i++)

		{

			char str[1000];

			char *p;

			gets(str);

			//puts(str);

			p = strtok(str," ");

			int cnt[110];

			int j = 0;

			while(p)

			{

				cnt[j++] = atoi(p);

				p = strtok(NULL," ");

			}

			for(k = 1 ;k < j; k++)

			{

				for(t = 0; t < k; t++)

				{

					a[cnt[t]][cnt[k]] = min(a[cnt[t]][cnt[k]],b[i]*abs(cnt[k]-cnt[t]));

					a[cnt[k]][cnt[t]] = min(a[cnt[k]][cnt[t]],b[i]*abs(cnt[k]-cnt[t]));

				}

			}

		}

		floyd();

		if(a[0][m] == 999999999)

			puts("IMPOSSIBLE");

		else

			printf("%d\n",a[0][m]);

	}

	return 0;

}


 

 

你可能感兴趣的:(floyd)