比赛 10101115 评测结果 AWAAWWWWWT
题目名称 最小密度路径 最终得分 30
用户昵称 .Xmz 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-11-15 11:06:02
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

using namespace std;

struct edge
{
	int t;
	float v;
	edge *next;
}E[10001],*V[51];
int eh,n,m;
float f[51][51][1001];
bool y[51][51][1001];
float ans[51][51];
inline void addedge(int a,int b,float v)
{
	E[++eh].next=V[a]; V[a]=E+eh;  V[a]->t=b;  V[a]->v=v;
}

int qd[100001],qn[100001];
int qt,qw;
int inq[51][1001];

void spfa(int x)
{
	qt=0;qw=0;
	qd[0]=x;qn[0]=0;
	y[x][x][0]=true;
	memset(inq,0,sizeof(inq));
	inq[x][0]=true;
	while (qt<=qw)
	{
		int u=qd[qt];
		int dn=qn[qt++];
		inq[u][dn]=false;
		for (edge *e=V[u];e;e=e->next)
		{
			if (!y[x][e->t][dn+1] || f[x][e->t][dn+1]>f[x][u][dn]+e->v)
			{
				y[x][e->t][dn+1]=true;
				f[x][e->t][dn+1]=f[x][u][dn]+e->v;
				if (ans[x][e->t]>f[x][e->t][dn+1]/(float)(dn+1))
					ans[x][e->t]=f[x][e->t][dn+1]/(float)(dn+1);
				if (!inq[e->t][dn+1])
				{
					qw++;
					qd[qw]=e->t;
					qn[qw]=dn+1;
					inq[e->t][dn+1]=true;
				}
			}
		}
	}
}
int main()
{
	freopen("path.in","r",stdin);
	freopen("path.out","w",stdout);
	scanf("%d%d",&n,&m);
	int a,b;float w;
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d%f",&a,&b,&w);
		addedge(a,b,w);
	}
	
	for (int i=1;i<=n;i++)
	for (int j=1;j<=n;j++)
		ans[i][j]=2000000000.0;
	
	for (int i=1;i<=n;i++) spfa(i);
	int q;
	scanf("%d",&q);
	
	for (int i=1;i<=q;i++)
	{
		scanf("%d%d",&a,&b);
		if (ans[a][b]<1500000000.0) printf("%0.3f\n",ans[a][b]);
		else printf("OMG!\n");
	}
	return 0;
}