比赛 东方幻想乡 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;
}