Dinic最大流:
cntn是当前图中点数,因为可能拆点,所以不一定总是n,随情况来变的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=1e13;
const int maxn=5050;
const int maxm=5050;
int cntn;
int n,m,s,t;
int k;ll speed;
ll maxflow;int vist;
int vis[maxn];
ll dep[maxn];
int cur[maxm];
struct node
{
int to,next;
int w;
ll val;
}edge[2*maxm];
int e,head[maxm];
void edge_init()
{
memset(head,0,sizeof(head));
e=1;
}
void add_edge(int u,int v,int w,ll val)
{
edge[++e].to=v;
edge[e].next=head[u];
edge[e].w=w;
edge[e].val=val;
head[u]=e;
}
bool bfs()
{
for(int i=0;i<=cntn;i++)
{
cur[i]=head[i];
dep[i]=inf;
vis[i]=0;
}
dep[s]=0;vis[s]=1;
queue<int> que;
que.push(s);
while(!que.empty())
{
int x=que.front();
que.pop();
vis[x]=0;
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
if(dep[y]>dep[x]+edge[i].w&&edge[i].val)
{
dep[y]=dep[x]+edge[i].w;
if(!vis[y])
{
que.push(y);vis[y]=1;
}
}
}
}
return dep[t]!=inf;
}
ll dfs(int u,ll low)
{
ll rlow=0;
if(u==t)
{
vist=1;
maxflow+=low;
return low;
}
int used=0;
for(int i=cur[u];i;i=edge[i].next)
{
cur[u]=i;
int y=edge[i].to;
if(edge[i].val&&dep[y]==dep[u]+1)
{
if(rlow=dfs(y,min(low,edge[i].val)))
{
used+=rlow;
edge[i].val-=rlow;
edge[i^1].val+=rlow;
if(used==low) break;
}
}
}
return used;
}
int Dinic()
{
int lowflow;
while(bfs())
{
vist=1;
while(vist==1)
{
vist=0;dfs(s,inf);
}
}
return maxflow;
}
int main()
{
edge_init();
scanf("%d%d",&n,&m);
cntn=n*3;
for(int i=1;i<=n;i++)
{
ll a;scanf("%lld",&a);
add_edge(i,i+n,1,a);
add_edge(i+n,i,1,0);
}
for(int i=1;i<=m;i++)
{
int a,b;ll c;
scanf("%d%d%lld",&a,&b,&c);
add_edge(a+n,b,1,c);
add_edge(b,a+n,1,0);
}
int k;ll speed;
scanf("%d%lld",&k,&speed);
s=1;t=k+n;
ll fin=Dinic();
double zz=(speed*1.0)/(fin*1.0);
printf("%.8lf\n",zz);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=1<<30;
const int maxn=250;
const int maxm=5050;
int n,m,s,t;
int k;ll speed;
ll maxflow;int vist;
int vis[maxm];
ll dep[maxm];
int cur[maxm];
int cntn;
struct node
{
int to,next;
int w;
int val;
}edge[4*maxm];
int e,head[maxm];
void edge_init()
{
memset(head,-1,sizeof(head));
e=-1;
}
void add_edge(int u,int v,int w,ll val)
{
e++;
edge[e].to=v;
edge[e].next=head[u];
edge[e].w=w;
edge[e].val=val;
head[u]=e;
}
bool bfs(int s,int t)
{
for(int i=0;i<=cntn;++i) dep[i]=0;
queue<int> Q;
Q.push(s);
dep[s]=1;
for(int i=0;i<=cntn;i++) cur[i]=head[i];
while(!Q.empty())
{
s=Q.front();
Q.pop();
for(int i=head[s];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(edge[i].val>0&&!dep[v])
{
dep[v]=dep[s]+1;
if(v==t) return true;
Q.push(v);
}
}
}
return false;
}
int dfs(int s,int t,int flow)
{
if(s==t||flow<=0) return flow;
int sf=0;
for(int i=cur[s];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
cur[s]=i;
if(edge[i].val&&dep[v]==dep[s]+1)
{
int res=dfs(v,t,min(flow,edge[i].val));
if(res<=0) continue;
edge[i].val-=res;
edge[i^1].val+=res;
sf+=res;
flow-=res;
if(flow<=0) break;
}
}
return sf;
}
int dinic(int s,int t)
{
int ans=0;
while(bfs(s,t))
{
ans+=dfs(s,t,inf);
}
return ans;
}
int main()
{
edge_init();
e=-1;
maxflow=0;
scanf("%d%d",&n,&m);
cntn=3*n;
for(int i=1;i<=n;i++)
{
int a;
scanf("%d",&a);
add_edge(i,i+n,1,a);
add_edge(i+n,i,1,0);
}
for(int i=1;i<=m;i++)
{
int a,b;int c;
scanf("%d%d%d",&a,&b,&c);
add_edge(a+n,b,1,c);
add_edge(b,a+n,1,0);
}
scanf("%d%lld",&k,&speed);
s=1;t=k+n;
int fin=dinic(s,t);
double zz=(speed*1.0)/(fin*1.0);
printf("%.8lf\n",zz);
return 0;
}