多组输入,保证绝大部分为小数据。 每组输入第一行n m(1<=n<=100,1<=m<=10000),表示n个点m条有向边。 接下来m行,每行u v(1<=u,v<=n),表示有一条有向边从u连向v
算出vigoss18在所有位置的概率,并输出其中的最大值即可。 你的答案与标准答案的误差应保持在1e-6以内。示例1
3 3 1 2 2 3 3 1
0.333333333思路:
既然我们已经知道跑的时间越长越会使得答案收敛到一个解,那么我们直接按照它所说的暴力去做就行。
赛后看到500次基本就足够了。
设定Dp【i】【j】表示时间为i,走到j这个点的概率。
那么有:
①Dp【i】【j】=Dp【i-1】【j】*概率
②Dp【i】【to】=Dp【i-1】【from】*概率。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
double dp[505][105];
vector<int>mp[15000];
int main()
{int n,m;while(~scanf("%d%d",&n,&m)){for(int i=1;i<=n;i++)mp[i].clear();for(int i=0;i<=500;i++){for(int j=1;j<=n;j++){dp[i][j]=0;}}for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);mp[x].push_back(y);}dp[0][1]=1;for(int i=0;i<500;i++){for(int j=1;j<=n;j++){int sz=mp[j].size();dp[i+1][j]+=(double)dp[i][j]/(sz+1);for(int k=0;k<sz;k++){dp[i+1][mp[j][k]]+=dp[i][j]/(sz+1);}}}double ans=0;for(int i=1;i<=n;i++)ans=max(ans,dp[500][i]);printf("%.9lfn",ans);}
}
本文发布于:2024-02-04 23:32:02,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170718890360760.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |