Cod sursa(job #2350476)

Utilizator vladcoroian2001Vlad Coroian vladcoroian2001 Data 21 februarie 2019 13:55:41
Problema Tunelul groazei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <cmath>
#include <iomanip>
#include <vector>

using namespace std;
ifstream fi("tunel.in");
ofstream fo("tunel.out");
const int NMAX=300;
const double eps=1e-10;
int n,m,grad[NMAX],x,y,t;
double A[NMAX][NMAX],X[NMAX],val;
vector <pair<int,int>> V[NMAX];
int main()
{
	fi>>n>>m;
	for(int i=1;i<=m;i++)
	{
		fi>>x>>y>>t;
		grad[x]++; grad[y]++;
		V[x].push_back({y,t});
		V[y].push_back({x,t});
	}
	for(int i=1;i<=n;i++)
	{
		A[i][i]=-grad[i];
		for(auto edge: V[i])
		{
			int j=edge.first;
			int t=edge.second;
			A[i][n+1]-=(double)t;
			A[i][j]+=1;
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++)
			if(abs(A[j][i])>eps)
			{
				if(i!=j)
					for(int k=1;k<=n+1;k++)
						swap(A[i][k],A[j][k]);
				for(int k=n+1;k>=i;k--)
					A[i][k]/=A[i][i];
				for(int l=i+1;l<=n;l++)
				{
					val=A[l][i]/A[i][i];
					A[l][i]=0;
					for(int k=i+1;k<=n+1;k++)
						A[l][k]-=val*A[i][k];
				}
			}
	for(int i=n;i>=1;i--)
	{
		val=A[i][n+1];
		for(int j=n;j>i;j--)
			val-=A[i][j]*X[j];
		if(A[i][i]==0) X[i]=0;
		else X[i]=val/A[i][i];
	}
	fo<<fixed<<setprecision(4)<<X[1]<<"\n";
	fi.close();
	fo.close();
	return 0;
}