Pagini recente » Cod sursa (job #2801719) | Cod sursa (job #2734744) | Cod sursa (job #2272632) | Cod sursa (job #1816036) | Cod sursa (job #186041)
Cod sursa(job #186041)
#include <fstream>
#include <vector>
using namespace std;
#define MAX 300
double a[MAX][MAX], sol[MAX];
vector < pair<int,int> > G[MAX];
int N,M;
ifstream fin("tunel.in");
ofstream fout("tunel.out");
void build()
{
for (int i = 1; i<N; i++)
{
a[i][i] = 1;
int grad = G[i].size();
int dist = 0;
for ( vector < pair<int, int> > :: iterator it = G[i].begin(); it!= G[i].end(); it++)
{
dist+= it->second;
a[i][ it->first] += - 1.0 / grad;
}
a[i][N+1] = (double) dist / grad;
}
a[N][N] = 1;
a[N][N+1] = 0;
}
void gauss()
{
for (int j = 1; j<N; j++)
{
int poz = -1;
for (int i = j; i<=N; i++)
if ( a[i][j] != 0 )
{
poz = i; break;
}
for ( int i = 1; i<=N+1; i++)
swap(a[j][i], a[poz][i]);
for (int i = j+1; i<=N; i++)
if ( i != j )
{
double fact = -a[i][j] / a[j][j];
for (int k = 1; k<=N+1; k++)
a[i][k] += fact * a[j][k];
}
}
}
void solve()
{
sol[N] = 0;
for ( int i= N-1; i>0; i--)
{
double sum = 0;
for (int j = i + 1; j<=N; j++)
sum += a[i][j]*sol[j];
sol[i] = ( a[i][N+1] - sum ) / a[i][i];
}
}
int main()
{
fin>>N>>M;
for ( ; M>0; M--)
{
int a,b,c;
fin>>a>>b>>c;
G[a].push_back( make_pair( b,c));
G[b].push_back( make_pair( a,c));
}
build();
gauss();
solve();
fout<<sol[1]<<"\n";
return 0;
}