Pagini recente » Cod sursa (job #96136) | Cod sursa (job #2624867) | Cod sursa (job #353986) | Cod sursa (job #611097)
Cod sursa(job #611097)
#include <stdio.h>
#include <vector>
#include <utility>
#include <algorithm>
#define NMax 256
using namespace std;
const char IN[]="tunel.in",OUT[]="tunel.out";
int N,M;
double T[NMax] , Mat[NMax][NMax];
vector<pair<int,int> > ad[NMax];
void solve()
{
int i,j,k,l,col;
for (i=j=0;i<N && j<N;++j)
{
double r;
for (k=i;j<N && !Mat[k][i];++k);col=k;
r=Mat[col][j];
if (Mat[col][j])
{
for (k=0;k<=N;++k) swap(Mat[col][k],Mat[i][k]);
r=Mat[i][j];
for (k=0;k<=N;++k) Mat[i][k]/=r;
for (k=i+1;k<N;++k)
{
r=Mat[k][j];
for (l=j;l<=N;++l) Mat[k][l]-= Mat[i][l]*r;
}
++i;
}
}
for (i=N-1;i>=0;--i)
for (T[i]=Mat[i][N],j=N-1;j>i;--j)
T[i]-=T[j]*Mat[i][j];
}
int main()
{
int i,j,x,y,c;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&M);
while (M--) scanf("%d%d%d",&x,&y,&c),--x,--y,ad[x].push_back(make_pair(y,c)),ad[y].push_back(make_pair(x,c));
fclose(stdin);
--N;
for (i=0;i<N;++i)
{
Mat[i][i]=-1;
double r=1./ad[i].size();
for (j=0;j<(int)ad[i].size();++j)
if (ad[i][j].first!=N) Mat[i][N]-=r*ad[i][j].second,Mat[i][ad[i][j].first]=r;
else Mat[i][N]-=r*ad[i][j].second;
}
solve();
freopen(OUT,"w",stdout);
printf("%.8lf\n",T[0]);
fclose(stdout);
return 0;
}