记录编号 234931 评测结果 AAAAAAAAAA
题目名称 [NOI 2005]聪聪与可可 最终得分 100
用户昵称 GravatarFancy 是否通过 通过
代码语言 C++ 运行时间 0.118 s
提交时间 2016-03-09 20:10:16 内存使用 11.80 MiB
显示代码纯文本
#include<cstring>
#include<cstdio>
#include<queue>
#define N 1001
using namespace std;
int n,m,S,T,ecnt=1,to[N*2],next[N*2],st[N],ds[N],du[N],g[N][N];
bool used[N];
double f[N][N];
queue<int> q;
void SPFA(int K)
{
	memset(ds,0x7f,sizeof(ds));
	memset(used,0,sizeof(used));
	q.push(K);ds[K]=0;used[K]=1;g[K][K]=K;
	while(!q.empty())
	{
		int x=q.front();q.pop();
		for(int i=st[x];i;i=next[i])
		{
			int y=to[i];
			if(!used[y]) used[y]=1,ds[y]=ds[x]+1,q.push(y);
			if(ds[y]<ds[g[x][K]]||(ds[y]==ds[g[x][K]]&&y<g[x][K])) g[x][K]=y;
		}
	}
}
double Search(int s,int t)
{
	if(s==t) return 0;
	if(g[s][t]==t||g[g[s][t]][t]==t) return 1;
	if(f[s][t]) return f[s][t];
	int C=g[g[s][t]][t];
	double ans=Search(C,t);
	for(int i=st[t];i;i=next[i]) ans+=Search(C,to[i]);
	return f[s][t]=ans/(du[t]+1)+1;
}
int main()
{
	freopen("cchkk.in","r",stdin);
	freopen("cchkk.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&S,&T);
	for(int i=1,x,y;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		to[++ecnt]=y;next[ecnt]=st[x];st[x]=ecnt;du[x]++;
		to[++ecnt]=x;next[ecnt]=st[y];st[y]=ecnt;du[y]++;
	}  
	for(int i=1;i<=n;i++) SPFA(i);
	printf("%.3lf",Search(S,T));
	return 0;
}