题目:
#include
using namespace std;
int n,m,hed[710],cnt,m1,n1,inq[710],q[200001],h,t,st,ed;
int dep[710];
double dis[710],eps=1e-3,c[200001],d[710],res;
struct node
{
int from,to,next;
double safe,t;
}e[200001],b[200001];
struct gg
{
int to,next;
double c;
}a[401000];
int jingdu(double x)
{
if(x<=eps&&x>=-eps)
return 0;
if(x>0)
return 1;
else
return -1;
}
void add(int from,int to)
{
b[++cnt].from=from;
b[cnt].to=to;
b[cnt].next=hed[from];
hed[from]=cnt;
}
void ins(int from,int to,double c)
{
a[++cnt].to=to;
a[cnt].c=c;
a[cnt].next=hed[from];
hed[from]=cnt;
a[++cnt].to=from;
a[cnt].c=0;
a[cnt].next=hed[to];
hed[to]=cnt;
}
void spfa(int id)
{
memset(d,127,sizeof(d));
memset(inq,0,sizeof(inq));
inq[n]=1;
q[1]=n;
d[n]=0;
h=1;t=2;
while(h!=t)
{
int x=q[h];
inq[x]=0;
for(int i=hed[x];i;i=b[i].next)
{
int y=b[i].to;
if(jingdu(d[y]-d[x]-c[i])>0)
{
d[y]=d[x]+c[i];
//到id的最短路有负权边直接退出
if(y==id&&jingdu(d[y])<=0)
return;
if(!inq[y])
{
q[t++]=y;
inq[y]=1;
}
}
}
h++;
}
}
int check(int id,double mid)
{
for(int i=1;i<=m;i++)
c[i]=e[i].t-e[i].safe*mid;
spfa(id);
if(jingdu(d[id])<=0)
return 1;
else
return 0;
}
double find(int id)
{
double l=0,r=10,mid,ji=2e9;
while(r-l>eps)
{
mid=(l+r)/2.0;
if(check(id,mid))
ji=r=mid;
else
l=mid;
}
return ji;
}
int bfs()
{
memset(dep,0,sizeof(dep));
q[1]=st;
h=1;t=2;
dep[st]=1;
while(h!=t)
{
int x=q[h];
for(int i=hed[x];i;i=a[i].next)
{
int y=a[i].to;
if(jingdu(a[i].c)&&dep[y]==0)
{
dep[y]=dep[x]+1;
q[t++]=y;
}
}
h++;
}
if(dep[ed]>0)
return 1;
else
return 0;
}
double flow(int x,double f)
{
if(x==ed||!jingdu(f))
return f;
double s=0,t;
for(int i=hed[x];i;i=a[i].next)
{
int y=a[i].to;
if(dep[y]==dep[x]+1&&jingdu(a[i].c))
{
s+=(t=flow(y,min(a[i].c,f-s)));
a[i].c-=t;
a[i^1].c+=t;
f-=t;
if(!jingdu(f))
break;
}
}
if(!jingdu(s))
dep[x]=0;
return s;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%lf%lf",&e[i].from,&e[i].to,&e[i].t,&e[i].safe);
add(e[i].from,e[i].to);
}
scanf("%d%d",&m1,&n1);
for(int i=1;i<=n1;i++)
dis[i]=find(i);
st=n+1,ed=n+2;
cnt=1;
memset(hed,0,sizeof(hed));
for(int i=1;i<=n1;i++)
{
if(i&1)
ins(st,i,dis[i]);
else
ins(i,ed,dis[i]);
}
for(int i=1;i<=m1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ins(x,y,2e9);
}
while(bfs())
res+=flow(st,2e9);
if(res>1e8)
printf("-1\n");
else
printf("%.1lf\n",res);
return 0;
}