Pagini recente » Cod sursa (job #2089939) | Cod sursa (job #2709620) | Cod sursa (job #3031756) | Cod sursa (job #2072322) | Cod sursa (job #3137040)
#include <bits/stdc++.h>
#define L 105
#define EPS 0.0000000001
#define INF (1LL << 62)
using namespace std;
ifstream fin("flux.in");
ofstream fout("flux.out");
int n, edges;
vector <pair <int, double>> G[L];
double m[L][L];
bool vis[L];
int main(){
fin >> n >> edges;
for (int i = 1; i <= edges; i++){
int a, b, c;
fin >> a >> b >> c;
assert(a == b);
G[a].push_back({b, c});
G[b].push_back({a, c});
}
m[1][1] = 1;
for (int i = 2; i < n; i++){
int neighbours = G[i].size();
for (int j = 0; j < neighbours; j++)
m[i][G[i][j].first]++;
m[i][i] = -neighbours;
}
for (int j = 1; j <= n; j++){
int rel = -1;
for (int i = 1; i <= n; i++)
if (abs(m[i][j]) > EPS && !vis[i]){
rel = i;
break;
}
if (rel == -1)
continue;
vis[rel] = true;
double x = m[rel][j];
for (int k = 1; k <= n + 1; k++)
m[rel][k] /= x;
for (int i = 1; i <= n; i++)
if (i != rel){
double coef = m[i][j];
for (int k = 1; k <= n + 1; k++)
m[i][k] -= coef * m[rel][k];
}
}
double last_node = INF;
for (int i = 1; i <= n; i++)
for (auto it : G[i]){
double cost_diff = abs(m[i][n] - m[it.first][n]);
if (cost_diff < EPS)
last_node = 0;
else
last_node = min(last_node, it.second / cost_diff);
}
double ans = 0;
for (auto it : G[n])
ans += last_node * (m[it.first][n] + 1);
fout << ans << "\n";
return 0;
}