比赛 |
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;
}