Pagini recente » Istoria paginii utilizator/ilincaaghenitei | Cod sursa (job #520026) | Istoria paginii runda/best/clasament | Cod sursa (job #2005098) | Cod sursa (job #1462912)
#include <fstream>
#include <vector>
#include <cmath>
#include <iomanip>
#define Nmax 300
#define eps 0.0000000001
#define pb push_back
using namespace std;
int grad[Nmax],sum[Nmax],n;
double a[Nmax][Nmax];
vector <int> L[Nmax];
inline void SwapL(int l1, int l2)
{
if(l1==l2) return;
for(int i=1;i<=n+1;++i) swap(a[l1][i],a[l2][i]);
}
int main()
{
int x,y,z,m,i,j,k;
ifstream cin("tunel.in");
ofstream cout("tunel.out");
cin>>n>>m;
while(m--)
{
cin>>x>>y>>z;
L[x].pb(y); L[y].pb(x);
++grad[x]; ++grad[y];
sum[x]+=z; sum[y]+=z;
}
for(i=1;i<=n;++i)
{
a[i][i]=1;
for(auto it : L[i]) a[i][it]= (double)-1 / grad[i];
a[i][n+1]=((double)1 / grad[i]) * sum[i];
}
a[n+1][n]=1; /// dp[n] = 0;
for(i=1;i<=n;++i)
{
for(j=i;j<=n+1 && fabs(a[j][i])<=eps;++j);
SwapL(i,j);
for(j=1;j<=n+1;++j)
if(j!=i)
{
double rap=-(a[j][i]/a[i][i]);
for(k=1;k<=n+1;++k) a[j][k]+=rap*a[i][k];
}
}
cout<<setprecision(10)<<fixed;
cout<<a[1][n+1]/a[1][1]<<"\n";
return 0;
}