比赛 |
20160421x |
评测结果 |
AWAAAWWWWW |
题目名称 |
电子碰撞 |
最终得分 |
40 |
用户昵称 |
Satoshi |
运行时间 |
0.112 s |
代码语言 |
C++ |
内存使用 |
75.85 MiB |
提交时间 |
2016-04-21 15:56:41 |
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <vector>
#define N 22
#define M 100010
using namespace std;
typedef long double ld;
ifstream cin("electrics.in");
ofstream cout("electrics.out");
int n,m,s,t;
ld p[N]={0};
vector<int> G[N];
ld f[N][M];
ld g[N][M];
ld degree[N]={0};
ld S[N][M];
ld sum[N]={0};
int ans[N]={0};
void read()
{
int i,u,v;
cin>>n>>m>>s>>t;
for(i=1;i<=m;i++)
{
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
degree[u]++;
degree[v]++;
}
for(i=1;i<=n;i++)cin>>p[i];
}
bool com(int i,int j)
{
return sum[i]>sum[j];
}
void work()
{
int i,j,u,v,T;
ld solo=0;
f[s][0]=1;
g[t][0]=1;
//for(i=1;i<=n;i++)cout<<(1-p[i])/degree[i]<<endl;
//for(T=1;T<=10000;T++)for(i=1;i<=n;i++)s[T][i]=0;
for(T=1;T<=10000;T++)
{
for(i=1;i<=n;i++)
{
u=i;
f[u][T]+=(1-S[u][T-1])*f[u][T-1]*p[u];
g[u][T]+=(1-S[u][T-1])*g[u][T-1]*p[u];
for(j=0;j<G[u].size();j++)
{
v=G[u][j];
f[v][T]+=(1-S[u][T-1])*f[u][T-1]*(1-p[u])/degree[u];
g[v][T]+=(1-S[u][T-1])*g[u][T-1]*(1-p[u])/degree[u];
}
}
for(i=1;i<=n;i++)S[i][T]=f[i][T]*g[i][T];
}
for(T=1;T<=10000;T++)
{
for(i=1;i<=n;i++)
{
sum[i]+=S[i][T];
}
}
//for(i=1;i<=n;i++)cout<<sum[i]<<endl;
for(i=1;i<=n;i++)ans[i]=i;
sort(ans+1,ans+n+1,com);
for(i=1;i<=n;i++)cout<<ans[i]<<endl;
/*for(T=0;T<=10000;T++)
{
for(i=1;i<=n;i++)
{
ans[i]+=f[i][T]*g[i][T];
cout<<f[i][T]*g[i][T]<<' ';
}
cout<<endl;
}
for(i=1;i<=n;i++)cout<<ans[i]<<' ';
cout<<endl;*/
}
int main()
{
read();
work();
return 0;
}