#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=1e4+5,mod=1e9+7;
const ll inf=1e15;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
int n,m,cnt=1,h[N],st,ed,dep[N],cur[N];
struct edge{
int to,nt;double w;
}e[M],e1[M];
void add(int u,int v,double w){
e1[++cnt]={v,h[u],w},h[u]=cnt;
e1[++cnt]={u,h[v],0},h[v]=cnt;
}
bool bfs(){
queue<int>q;q.push(st),mst(dep,0),dep[st]=1;
while(!q.empty()){
int u=q.front();q.pop();cur[u]=h[u];
for(int i=h[u];i;i=e[i].nt){
int v=e[i].to;
double w=e[i].w;
if(w>0&&!dep[v]) dep[v]=dep[u]+1,q.push(v);
}
}return dep[ed];
}
double dfs(int u,double c){
if(u==ed) return c;double res=c;
for(int &i=cur[u];i;i=e[i].nt){
int v=e[i].to;
double w=e[i].w;
if(w>1e-5&&dep[v]==dep[u]+1){
double now=dfs(v,min(res,w));
if(!now) dep[v]=1;
else e[i].w-=now,e[i^1].w+=now,res-=now;
}if(res<1e-5) return c;
} return c-res;
}
double sap(){
double s=0;while(bfs()) s+=dfs(st,1e15);
return s;
}
int main(){
double p;
scanf("%d%d%lf",&n,&m,&p);
double l=0,r=0;
for(int i=1,u,v;i<=m;i++){
double w;
scanf("%d%d%lf",&u,&v,&w),add(u,v,w),r=max(r,w);
}for(int i=2;i<=cnt;i++) e[i]=e1[i];
double mc=0;st=1,ed=n;
mc=sap();printf("%.0f\n",mc);
while(r-l>1e-4){
double mid=(l+r)/2;
for(int i=2;i<=cnt;i+=2){
e[i].w=e1[i].w<mid?e1[i].w:mid;
e[i+1].w=0;
}
double tmp=sap();
// printf("%lf %lf\n",l,r);
if(fabs(mc-tmp)>1e-5) l=mid;
else r=mid;
}printf("%.10f\n",l*p);
return 0;
}
是不是dinic 写假了,为啥更新边权后,二分得不对了。