记录编号 98288 评测结果 AAAAAAAA
题目名称 最小密度路径 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.060 s
提交时间 2014-04-22 15:52:27 内存使用 0.97 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int SIZEN=55,INF=0x7fffffff/2;
int len[SIZEN][SIZEN][SIZEN];
double ans[SIZEN][SIZEN];
int N,M,Q;
void answer(void){
	scanf("%d",&Q);
	while(Q--){
		int a,b;
		scanf("%d%d",&a,&b);
		if(ans[a][b]>100000){
			printf("OMG!\n");
		}
		else printf("%.3lf\n",ans[a][b]);
	}
}
void work(void){
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			ans[i][j]=INF+0.0;
			if(i==j) ans[i][j]=0;
			for(int k=1;k<=N;k++){
				if(len[i][j][k]==INF) continue;
				double temp=(len[i][j][k]+0.0)/(k+0.0);
				ans[i][j]=min(ans[i][j],temp);
			}
		}
	}
}
void floyd(void){
	for(int t=2;t<=N;t++){
		for(int k=1;k<=N;k++){
			for(int i=1;i<=N;i++){
				for(int j=1;j<=N;j++){
					if(len[k][j][1]==INF) continue;
					if(len[i][k][t-1]==INF) continue;
					len[i][j][t]=min(len[i][j][t],len[i][k][t-1]+len[k][j][1]);
				}
			}
		}
	}
}
void read(void){
	scanf("%d%d",&N,&M);
	for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) for(int k=0;k<=N;k++) len[i][j][k]=INF;
	for(int i=1;i<=M;i++){
		int a,b,w;
		scanf("%d%d%d",&a,&b,&w);
		len[a][b][1]=min(len[a][b][1],w);
	}
}
int main(){
	freopen("path.in","r",stdin);
	freopen("path.out","w",stdout);
	read();
	floyd();
	work();
	answer();
	return 0;
}