下面这个伪代码竟然过了
#pragma GCC optimize(3)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#define inf 99999999
#define dl double
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(a) ((a)>0?(a):-(a))
#define re register
#define FOR(i,a,b) for(re int i=(a) ; i<=(b) ; ++i)
#define AFOR(i,a,b) for(re int i=(a) ; i>=(b) ; --i)
#define REP(i,u) for(re int i=head[u],v=edge[i].to;i!=-1;i=edge[i].nxt,v=edge[i].to)
#define gc getchar()
using namespace std;
const int N=1e4+10;
char buf[1<<18],*fs,*ft;
inline ll read() {
ll w=0,p=0;
char ch=gc;
while(!isdigit(ch)) w=ch=='-'?1:0,ch=gc;
while(isdigit(ch)) p=p*10+ch-'0',ch=gc;
return w?-p:p;
}
inline void write(ll x) {
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return ;
}
struct ao{
int u,v;
dl w;
}e[N];
int n,m,rt,cnt;
dl ans;
int fa[N],id[N],top[N],sum[N];
dl val[N];
inline void zhuliu(){
while(1){
FOR(i,1,n) id[i]=top[i]=0,val[i]=inf;
FOR(i,1,m) if(e[i].u!=e[i].v&&val[e[i].v]>e[i].w) fa[e[i].v]=e[i].u,val[e[i].v]=e[i].w;
int u=val[rt]=0;
FOR(i,1,n) {
ans+=val[i];
for(u=i;u!=rt&&top[u]!=i&&!id[u];u=fa[u]) top[u]=i;
if(u!=rt&&!id[u]){
id[u]=++cnt;
for(int v=fa[u];v!=u;v=fa[v]) id[v]=cnt;
}
}
if(!cnt) return ;
FOR(i,1,n) if(!id[i]) id[i]=++cnt;
FOR(i,1,m){
dl ww=val[e[i].v];
if((e[i].u=id[e[i].u])!=(e[i].v=id[e[i].v])) e[i].w-=ww;
}
n=cnt,rt=id[rt],cnt=0;
}
return ;
}
inline void work(){
++n,rt=n;
FOR(i,1,n-1) e[++m]=(ao){rt,i,val[i]};
FOR(i,1,m) if(e[i].u!=e[i].v) val[e[i].v]=min(val[e[i].v],e[i].w);
FOR(i,1,n-1) ans+=val[i]*(sum[i]-1);
return ;
}
int main() {
scanf("%d",&n);
FOR(i,1,n) scanf("%lf%d",&val[i],&sum[i]);
scanf("%d",&m);
FOR(i,1,m) scanf("%d%d%lf",&e[i].u,&e[i].v,&e[i].w);
work();
zhuliu();
printf("%.2lf",ans);
return 0;
}