做高斯消元忽然想起以前的一个比赛 便拿来水水啦
同时也对期望DP又有啦一个新的认识!!!!
提醒下最后一个点一直wa的
#include <cmath>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const double EPS=1e-7;
const int MAXN=200+10;
int n,m,d[MAXN],v[MAXN][MAXN];
double ans[MAXN],f[MAXN][MAXN];
void gauss()
{
for(int i=1;i<n;i++)
{
int t;
for(int j=i;j<n;j++)
if(abs(f[i][j])>EPS)
{
t=i;
break;
}
if(t!=i)
for(int j=i;j<=n;j++)
swap(f[i][j],f[t][j]);
for(int j=i+1;j<n;j++)
{
double tmp=f[j][i]/f[i][i];
for(int k=i;k<=n;k++)
f[j][k]-=tmp*f[i][k];
}
}
for(int i=n-1;i>=1;i--)
{
ans[i]=f[i][n]/f[i][i];
for(int j=i-1;j>=1;j--)
f[j][n]-=f[j][i]*ans[i];
}
}
int main()
{
cin >>n >>m;
for (int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
d[x]++;d[y]++;
v[x][y]=v[y][x]=z;
}
for(int i=1;i<n;i++)
for(int j=1;j<n;j++)
{
if(i==j) f[i][j]=1*d[i];
else if(v[i][j]!=0)
{
f[i][j]=-1.0;
f[i][n]+=(double)v[i][j];
}
}
for(int i=1;i<n;i++)
if(v[i][n]!=0)
f[i][n]+=(double)v[i][n];
gauss();
printf("%.1lf",ans[1]);
return 0;
}