Pagini recente » Cod sursa (job #491029) | Cod sursa (job #1031376) | Cod sursa (job #1187676) | Cod sursa (job #1515638) | Cod sursa (job #2712743)
#include <bits/stdc++.h>
#define DIMN 110
#define EPS 0.0000000001
using namespace std;
vector <pair <int , int> > v[DIMN];
long double a[DIMN][DIMN] , x[DIMN];
void intersc (int i,int k,int m){
int j;
for (j=1;j<=m+1;j++)
swap(a[i][j],a[k][j]);
}
int main()
{
FILE *fin = fopen ("flux.in","r");
ofstream fout ("flux.out");
int n , m , i , j , xx , y , c , k , ii , jj , vecin;
fscanf (fin,"%d%d",&n,&m);
for (i = 1 ; i <= m ; i++){
fscanf (fin,"%d%d%d",&xx,&y,&c);
v[xx].push_back(make_pair(y , c));
v[y].push_back(make_pair(xx , c));
if (xx != 1 && xx != n){ /// variabila care ma intereseaza
a[xx][xx]++; /// contribuie de grad
a[xx][y]--; /// contribuie la nr de muchii
}
if (y != 1 && y != n){
a[y][y]++; /// contribuie la grad
a[y][xx]--; /// contribuie la nr de muchii
}
}
/// x1 = 0
a[1][1] = 1;
a[n][n + 1] = 1;
a[n][n] = 1; /// pe xn vreau sa il fac 1 (1 * maxim flux de pe viitor)
i=j=1;
while (i<=n && j<=n){
for (k=i;k<=n;k++)
if (a[k][j]!=0) // caut prm coef dif de 0
break;
if (k==n+1){ // toti coef sunt 0, e variabila libera
j++;
continue;
}
intersc (i,k,n); // interschimb liniile i si k
for (k=j+1;k<=n+1;k++)
a[i][k]/=a[i][j];
a[i][j]=1;
for (ii=i+1;ii<=n;ii++)
for (jj=n+1;jj>=j;jj--)
a[ii][jj]=a[ii][jj]-a[i][jj]*a[ii][j];
i++;
j++;
}
// aflarea solutiilor
for (i=n;i>0;i--){
for (j=1;j<=n+1;j++)
if (a[i][j]>EPS || a[i][j]<-EPS)
break;
if (j==n+1){
fout << "0.000"; // 0*x1 + 0*x2 +... 0*xn = y, y!=0 => imposibil
return 0;
}
if (j==n+2) // e libera
continue;
x[j]=a[i][n+1]/a[i][j];
for (k=i-1;k>0;k--)
a[k][n+1]-=x[j]*a[k][j];
}
long double mini = 2000000000.0;
for (i = 1 ; i <= n ; i++){
for (j = 0 ; j < v[i].size() ; j++){
vecin = v[i][j].first;
c = v[i][j].second;
if (x[vecin] != x[i]){
if (x[vecin] > x[i] + EPS)
mini = min(mini , 1.0 * c / (x[vecin] - x[i]));
else if (x[vecin] < x[i] - EPS)
mini = min(mini , 1.0 * c / (x[i] - x[vecin]));
}
}
}
i = n;
long double sol = 0.0;
for (j = 0 ; j < v[i].size() ; j++){
vecin = v[i][j].first;
c = v[i][j].second;
if (x[vecin] != x[i]){
if (x[vecin] > x[i] + EPS)
sol += mini * (x[vecin] - x[i]);
else if (x[vecin] < x[i] - EPS)
sol += mini * (x[i] - x[vecin]);
}
}
fout << setprecision(3) << fixed << sol;
return 0;
}