比赛 |
东方幻想乡 S3 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
铃仙•优昙华院•稻叶 |
最终得分 |
100 |
用户昵称 |
Makazeu |
运行时间 |
0.628 s |
代码语言 |
C++ |
内存使用 |
13.14 MiB |
提交时间 |
2012-08-09 19:38:11 |
显示代码纯文本
/*
*Problem : reisen
*Contest : Touhou Stage.3
*Author : Yee-fan Zhu
*Solution : Dynamic Programming
*Date : July 21,2012
*/
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
int N,M,T,u,v;
const int MAXN=55;
int degree[MAXN];
double F[555][MAXN][MAXN];
int mat[MAXN][MAXN];
double P[MAXN][MAXN];
inline void init()
{
freopen("reisen.in","r",stdin);
freopen("reisen.out","w",stdout);
scanf("%d %d %d\n",&N,&M,&T);
mat[0][1]=1;
degree[0]++;
for(int i=1;i<=M;i++)
{
scanf("%d %d\n",&u,&v);
mat[u][v]=1;
degree[u]++;
}
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
if(!mat[i][j]) continue;
if(mat[j][i]) P[i][j]=double(1)/double(degree[j]);
else P[i][j]=double(1)/double(degree[j]+1);
}
}
P[0][1]=double(1)/double(degree[1]+1);
}
inline void dp()
{
memset(F,0,sizeof(F));
F[0][0][1]=double(1);
for(int k=1;k<=T;k++)
{
for(int i=0;i<=N;i++)
{
for(int j=0;j<=N;j++)
{
if(!mat[i][j]) continue;
F[k][i][j]=F[k-1][i][j]*P[i][j];
for(int l=0;l<=N;l++)
{
if(j==l || !mat[l][i]) continue;
F[k][i][j]+=F[k-1][l][i]*P[l][i];
}
}
}
}
double ans=0;
for(int i=1;i<=N;i++)
{
ans=0;
for(int j=0;j<=N;j++)
ans+=F[T][j][i];
ans*=double(100);
printf("%.3lf\n",ans);
}
}
int main()
{
init();
dp();
return 0;
}