标签:1.0 概率dp col vector nta node sample name pre
InputThe first line contains an integer T, denoting the number of the test cases.
For each test case, the first line contains 3 integers n, m and d, denoting the number of vertices, the number of edges and the number of steps respectively. Then m lines follows, each containing two integers a and b, denoting there is an edge between node a and node b.
T<=20, n<=50, n-1<=m<=n*(n-1)/2, 1<=d<=10000. There is no self-loops or multiple edges in the graph, and the graph is connected. The nodes are indexed from 1.OutputFor each test cases, output n lines, the i-th line containing the desired probability for the i-th node.
Your answer will be accepted if its absolute error doesn‘t exceed 1e-5.Sample Input
2 5 10 100 1 2 2 3 3 4 4 5 1 5 2 4 3 5 2 5 1 4 1 3 10 10 10 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 4 9
Sample Output
0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.6993317967 0.5864284952 0.4440860821 0.2275896991 0.4294074591 0.4851048742 0.4896018842 0.4525044250 0.3406567483 0.6421630037
第一道比赛出的概率dp。找好状态记忆化搜索即可。
#include<bits/stdc++.h> #define MAX 55 using namespace std; typedef long long ll; int n,m,k; double ans; double dp[MAX][10005]; vector<int> v[MAX]; double dfs(int f,int x,int s){ int i; if(s>=k) return 1; if(dp[x][s]>-1) return dp[x][s]; int xx=v[x].size(); double cnt=0; for(i=0;i<v[x].size();i++){ if(v[x][i]==f) continue; cnt+=dfs(f,v[x][i],s+1)*(1.0/xx); } dp[x][s]=cnt; return cnt; } int main() { int t,i,j; int x,y; scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&m,&k); for(i=1;i<=n;i++){ v[i].clear(); } for(i=1;i<=m;i++){ scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); } for(i=1;i<=n;i++){ ans=0; memset(dp,-1,sizeof(dp)); for(j=1;j<=n;j++){ if(i==j) continue; ans+=dfs(i,j,0)*(1.0/n); } printf("%.10f\n",ans); } } return 0; }
标签:1.0 概率dp col vector nta node sample name pre
原文地址:https://www.cnblogs.com/yzm10/p/9665311.html