最暴力的做法比赛的时候都已经写出来了,但是还是超时了。
下来说要矩阵快速幂优化。
那么推一推就出来了,也是很简单。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
struct Matrix
{
double m[205][205];
}M;
int n,sum[205];
Matrix Mult(Matrix a,Matrix b) //矩阵乘法
{
Matrix ans;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
ans.m[i][j]=0.0;
for(int k=0;k<n;k++)
ans.m[i][j]+=a.m[i][k]*b.m[k][j];
}
}
return ans;
}
Matrix quickpow(Matrix a,int b) //矩阵快速幂
{
Matrix ans;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)
ans.m[i][j]=1.0;
else
ans.m[i][j]=0.0;
}
}
while(b)
{
if(b&1)
ans=Mult(ans,a);
a=Mult(a,a);
b/=2;
}
return ans;
}
int main()
{
int m,k;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
memset(sum,0,sizeof(sum));
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
M.m[i][j]=0.0;
}
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
u--,v--;
M.m[v][u]+=1.0;
M.m[u][v]+=1.0;
sum[u]++;
sum[v]++;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(sum[j]!=0.0)
M.m[i][j]=M.m[i][j]/(double)sum[j];
}
}
M=quickpow(M,k);
Matrix N;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
N.m[i][j]=0.0;
}
N.m[0][0]=1.0;
M=Mult(M,N);
for(int i=0;i<n;i++)
printf("%f ",M.m[i][0]);
printf("\n");
}
return 0;
}