记录编号 22110 评测结果 AWAWWWTTTT
题目名称 最小密度路径 最终得分 20
用户昵称 GravatarPom 是否通过 未通过
代码语言 C++ 运行时间 4.300 s
提交时间 2010-11-17 11:27:29 内存使用 28.03 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>

using namespace std;

const int MAXN=60;
const int MAXM=1011;
const double oo=1000000000;

int i,j,k,Q,n,m,p1,p2;
double a[MAXN][MAXN][MAXM],r,ans;

void init()
{
	freopen("path.in","r",stdin);
	freopen("path.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
			for (k=1;k<=m;k++)
			a[i][j][k]=oo;
	for (Q=1;Q<=m;Q++)
	{
		scanf("%d%d%lf",&i,&j,&r);
		if (r<a[i][j][1]) a[i][j][1]=r;
	}
}

void solve()
{
	for (k=1;k<=n;k++)
		for (i=1;i<=n;i++)
			for (j=1;j<=n;j++)
				for (p1=1;p1<m;p1++)
					for (p2=1;p2<=m-p1;p2++)
						if (a[i][k][p1]+a[k][j][p2]<a[i][j][p1+p2]) a[i][j][p1+p2]=a[i][k][p1]+a[k][j][p2];
	scanf("%d",&Q);
	for (;Q;Q--)
	{
		ans=oo;
		scanf("%d%d",&i,&j);
		for (k=1;k<=m;k++)
			if (ans>a[i][j][k]/k) ans=a[i][j][k]/k;
		if (ans<=10000000)
			printf("%0.3lf\n",ans);
		else printf("OMG!\n");
	}
}

int main()
{
	init();
	solve();
	return 0;
}