Pagini recente » Cod sursa (job #2308906) | Cod sursa (job #1360845) | Cod sursa (job #2913014) | Cod sursa (job #2356684) | Cod sursa (job #1926849)
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define Nmax 260
#define eps 1e-3
using namespace std;
vector < pair <int,int> > L[Nmax];
int grad[Nmax],n,wh[Nmax];
double a[Nmax][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]);
}
inline double Gauss()
{
int i=1,j=1,k,t;
while(i<=n+1 && j<=n)
{
for(k=i;k<=n+1 && fabs(a[k][j])<eps;++k);
if(k==n+2)
{
++j;
continue;
}
swapL(k,i);
for(k=1;k<=n+1;++k)
if(k!=i)
{
double r=-a[k][j]/a[i][j];
for(t=1;t<=n+1;++t) a[k][t]+=a[i][t]*r;
}
wh[i]=j;
++i; ++j;
}
for(i=1;i<=n+1;++i)
if(wh[i]==1) return a[i][n+1]/a[i][1];
}
int main()
{
int m,x,y,z,i;
ifstream cin("tunel.in");
ofstream cout("tunel.out");
cin>>n>>m;
while(m--)
{
cin>>x>>y>>z;
L[x].pb(mp(y,z)); L[y].pb(mp(x,z));
++grad[x]; ++grad[y];
}
for(i=1;i<=n;++i)
{
a[i][i]=1;
for(auto it : L[i])
{
a[i][it.fi]=(double) -1/grad[i];
a[i][n+1]+=(double) it.se/grad[i];
}
}
a[n+1][n]=1;
cout<<setprecision(3)<<fixed<<Gauss()<<"\n";
return 0;
}