思路:
设c[i][j]表示i传给j的伤害比例,很容易列出方程,然后就可以高斯消元求解
c o d e code code
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n, m;
double a[1000][1000];
double p[1000];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; i++)
scanf("%lf", &a[i][n+1]);
scanf("%d", &m);
for(int i=1; i<=m; i++)
{
int x, y;
double z;
scanf("%d%d%lf", &x, &y, &z);
a[y][x]+=z;
p[x]+=z;
}
for(int i=1; i<=n; i++)
a[i][i]=-1;
for(int i=1; i<=n; i++)
{
int maxx=i;
for(int j=i+1; j<=n; j++)
if(fabs(a[j][i])>fabs(a[maxx][i]))
maxx=j;
for(int j=1; j<=n+1; j++)
swap(a[i][j], a[maxx][j]);
for(int j=1; j<=n; j++)
{
if(j==i)
continue;
double tmp=a[j][i]/a[i][i];
for(int k=i+1; k<=n+1; k++)
a[j][k]-=tmp*a[i][k];
}
}
for(int i=1; i<=n; i++)
printf("%.6lf\n", fabs(a[i][n+1]/a[i][i]*(1-p[i])));
return 0;
}