Pagini recente » Cod sursa (job #2550223) | Cod sursa (job #2525564) | Cod sursa (job #181841) | Cod sursa (job #2489987) | Cod sursa (job #1722832)
#include<cstdio>
#include<vector>
#include<algorithm>
#define MAXN 110
#define INF 1000000000
#define EPS 1e-7
using namespace std;
vector<pair<int,int> > g[MAXN];
int n,m,seen[MAXN];
double equation[MAXN][MAXN],capacity[MAXN][MAXN],value[MAXN];
int edges[MAXN][MAXN];
void DFS(int node){
int i;
seen[node]=1;
for(i=1;i<=n;i++)
if(edges[node][i]>0&&seen[i]==0)
DFS(i);
}
bool IsZero(double x){
if(x>=-EPS&&x<=EPS)
return true;
return false;
}
int main(){
freopen("flux.in","r",stdin);
freopen("flux.out","w",stdout);
int i,j,k,l,a,b,c;
double temp,answer=INF;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
capacity[i][j]=INF;
for(i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
edges[a][b]++;
edges[b][a]++;
capacity[a][b]=capacity[b][a]=min(capacity[a][b],(double)c);
}
DFS(1);
if(seen[n]==0){
printf("0.000");
return 0;
}
for(i=2;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j){
equation[i][j]=edges[i][j];
equation[i][i]-=edges[i][j];
}
equation[n][n+1]=-1;
i=j=2;
while(i<=n&&j<=n){
k=i;
while(k<=n&&IsZero(equation[k][j])==true)
k++;
if(k==n+1){
j++;
continue;
}
if(k!=i)
for(l=1;l<=n+1;l++){
temp=equation[i][l];
equation[i][l]=equation[k][l];
equation[k][l]=temp;
}
for(l=j+1;l<=n+1;l++)
equation[i][l]/=equation[i][j];
equation[i][j]=1;
for(k=i+1;k<=n;k++){
for(l=j+1;l<=n+1;l++)
equation[k][l]=equation[k][l]-equation[i][l]*equation[k][j];
equation[k][j]=0;
}
i++;
j++;
}
for(i=n;i>=2;i--)
for(j=2;j<=n+1;j++)
if(IsZero(equation[i][j])==false){
value[j]=equation[i][n+1];
for(k=j+1;k<=n;k++)
value[j]=value[j]-value[k]*equation[i][k];
break;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j&&edges[i][j]>0){
temp=value[i]-value[j];
if(IsZero(temp)==true)
continue;
if(temp<0)
temp=-temp;
answer=min(answer,capacity[i][j]/temp);
}
printf("%.3f",answer);
return 0;
}