首页 > 其他分享 >[NOI2005]聪聪与可可

[NOI2005]聪聪与可可

时间:2022-10-23 09:33:38浏览次数:49  
标签:可可 head int vis NOI2005 num maxn 聪聪 dis

首先是猫的走路方式与老鼠的位置有关,点数又比较少,所以我们可以预处理 \(d_{i,j}\) 表示猫在 \(i\),老鼠在 \(j\) 时猫下一步的位置。

这样不确定的东西都集中到了老鼠身上。

设 \(f_{i,j}\) 表示猫在 \(i\),老鼠在 \(j\) 时猫吃到老鼠的期望步数。这个东西可以用记忆化搜索轻松解决。

#include <bits/stdc++.h>
using namespace std;
const int maxm=3002;
const int maxn=1002;
typedef double db;
int to[maxm],nxt[maxm],head[maxn],num;
void add(int x,int y){num++;to[num]=y;nxt[num]=head[x];head[x]=num;}
int n,m;
int cat,mou;
int d[maxn][maxn];int deg[maxn];db f[maxn][maxn];
int dis[maxn][maxn],vis[maxn];
void spfa(int S)
{
	for(int i=1;i<=n;i++) 
		vis[i]=0;
	queue<int> Q;
	dis[S][S]=0; Q.push(S); vis[S]=1;
	while(!Q.empty())
	{
		int p=Q.front(); vis[p]=0; Q.pop();
		for(int i=head[p];i;i=nxt[i])
		{
			if(dis[S][to[i]]>dis[S][p]+1)
			{
				dis[S][to[i]]=dis[S][p]+1;
				if(!vis[to[i]]) vis[to[i]]=1,Q.push(to[i]);
			}
		}
	}	
}
void pre()
{
	memset(d,0x3f,sizeof(d));
	for(int i=1;i<=n;i++)
		spfa(i);
	for (int i=1;i<=n;i++)
	{
		for (int h=head[i];h;h=nxt[h])
		{
			int t=to[h];
			for (int j=1;j<=n;j++)
				if(dis[i][j]-1==dis[t][j])
					d[i][j]=min(d[i][j],t);
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			f[i][j]=-1;
	}
/*	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			fprintf(stderr,"%d %d : %d\n",i,j,d[i][j]);
	}*/
}
db solve(int x,int y)
{
	if(f[x][y]>=0) return f[x][y];
	if(x==y) return f[x][y]=0;
	if(dis[x][y]<=2) return f[x][y]=1;
	db ret=1;int sec=d[d[x][y]][y];
	ret+=solve(sec,y)/(deg[y]+1);
	for(int i=head[y];i;i=nxt[i])
	{
		int v=to[i];
		ret+=solve(sec,v)/(deg[y]+1);
	}
	return f[x][y]=ret;
}
int main()
{
	//freopen("p.in","r",stdin);
	memset(dis,0x3f,sizeof(dis));
	scanf("%d%d",&n,&m);
	scanf("%d%d",&cat,&mou);
	for(int i=1;i<=m;i++)
	{
		int x,y;scanf("%d%d",&x,&y);
		add(x,y);add(y,x);
		deg[x]++;deg[y]++;
	}
	pre();
	printf("%.3lf",solve(cat,mou));
}

标签:可可,head,int,vis,NOI2005,num,maxn,聪聪,dis
From: https://www.cnblogs.com/cc0000/p/16817939.html

相关文章

  • P2254 [NOI2005] 瑰丽华尔兹
    P2254[NOI2005]瑰丽华尔兹设f[i][x][y]表示在第i个时段,钢琴在这个时段停止在(x,y)时的最大滑动激励转移:dir=1时f[i][x][y]=max{f[i-1][x+k][y]+k其中0<=k<=ed-st+......
  • 做题记录整理dp810 P2254 [NOI2005] 瑰丽华尔兹(2022/9/23)
    P2254[NOI2005]瑰丽华尔兹题解这题的难点在与dp的递推方程的书写如果写对了递推方程,想到单调队列优化是很自然的(然而我想到了不会打)还有递推方程的具体代码实现也挺......
  • P2634 [国家集训队]聪聪可可
    简要题意给你一个\(n\)各节点的树,每一个边有一个权值。你需要求出树上任意两个的点之间的简单路径权值和(相同的点结果是\(0\))是\(3\)的倍数的概率。输出概率的最简分......
  • 洛谷P7907 [Ynoi2005] rmscne
    数据结构好题首先将询问离线,扫描线扫答案区间的左端点。设和\(l\)颜色相同的下一个位置为\(x\)。那么对于左端点\(\leql\),\(l\leq\)右端点$<x$的询问,\(l\)......