Pagini recente » Cod sursa (job #474868) | Cod sursa (job #1417784) | Cod sursa (job #1909523) | Cod sursa (job #2731095) | Cod sursa (job #75014)
Cod sursa(job #75014)
#include <cstdio>
#include <vector>
#include <iostream>
#define INF "flux.in"
#define OUF "flux.out"
#define NMAX 128
#define pb push_back
#define MIN(a,b) ((a<b)?(a):(b))
#define BIG 100000000
#define EPS 1e-3
using namespace std;
double c[NMAX][NMAX]={0},f[NMAX][NMAX]={0};
int t[NMAX],n,m,s,d;
vector<int> vi[NMAX];
void HA_HA_HA()
{
double CRAP;
int flux,aux=1;
CRAP=aux;
}
double bfs()
{
// cout<<"BF"<<endl;
int p,q,i,u,v;
vector<int> que;
double cp[NMAX];
que.pb(s);
p=0;q=1;
for(i=1;i<=n;++i) t[i]=0;
t[s]=-1;cp[s]=BIG;
while(p<q)
{
u=que[p]; ++p;
// cout<<"U: "<<u<<endl;
for(i=0;i<vi[u].size();++i)
{
v=vi[u][i];
// cout<<v<<' '<<c[u][v]<<' '<<f[u][v]<<endl;
if(c[u][v]-f[u][v]>EPS&&t[v]==0)
{
t[v]=u;
cp[v]=MIN(cp[u],c[u][v]-f[u][v]);
if(v!=d) { que.pb(v);++q;}
else
return cp[d];//se gaseste flux
}
}
// cout<<endl;
}
return 0;//nu se gaseste flux
}
double flux()
{
int ok,u,v;
double trans,fluxx=0;
do
{
ok=1;
trans=bfs();
// cout<<trans<<endl;
if(trans<1) ok=0;
fluxx+=trans;
if(ok)
{
v=d;
while(v!=s)
{
u=t[v];
f[u][v]+=trans;
f[v][u]-=trans;
v=u;
}
}
}while(ok);
return fluxx;
}
int main()
{
int i,a,b;
double cost;
FILE *in,*out;
in=fopen(INF,"r");
out=fopen(OUF,"w");
fscanf(in,"%d%d",&n,&m);
for(i=1;i<=m;++i)
{
fscanf(in,"%d%d%lf",&a,&b,&cost);
vi[a].pb(b);
vi[b].pb(a);
c[a][b]+=cost;
c[b][a]+=cost;
}
s=1;d=n;
fprintf(out,"%.3lf\n",flux());
fclose(in);fclose(out);
return 0;
}