#include <bits/stdc++.h> using namespace std; const int maxn=11111; const int inf=0x3f3f3f3f; int t,n; int u[maxn],v[maxn],w[maxn],head[maxn<<1]; int x[maxn<<1],cnt,ecnt; int d[maxn<<1],p[maxn<<1],inq[maxn<<1],a[maxn<<1]; struct Edge{ int u,v,cost,cap,flow,p; Edge(){}; Edge(int u,int v,int cost,int cap,int flow,int p):u(u),v(v),cost(cost),cap(cap),flow(flow),p(p){}; }e[maxn<<4]; void add(int u,int v,int c,int f){ e[ecnt]=Edge(u,v,c,f,0,head[u]); head[u]=ecnt++; } bool spfa(int s,int t){ memset(d,0x3f,sizeof d); memset(inq,0,sizeof inq); d[s]=0;inq[s]=1;a[s]=inf; queue<int>q; q.push(s); while(!q.empty()){ int u=q.front();q.pop(); inq[u]=0; for(int i=head[u];~i;i=e[i].p){ int v=e[i].v; if(e[i].cap>e[i].flow&&d[v]>d[u]+e[i].cost){ d[v]=d[u]+e[i].cost; p[v]=i; a[v]=min(a[u],e[i].cap-e[i].flow); if(!inq[v]){ q.push(v); inq[v]=1; } } } } return d[t]!=inf; } int mcmf(int s,int t){ int ans=0; while(spfa(s,t)){ ans+=d[t]; int u=t; while(u!=s){ e[p[u]].flow+=a[t]; e[p[u]^1].flow-=a[t]; u=e[p[u]].u; } } return ans; } int main() { // freopen("in","r",stdin); cin>>t; while(t--){ scanf("%d",&n); memset(head,-1,sizeof head); cnt=0; for(int i=0;i<n;i++){ scanf("%d%d%d",u+i,v+i,w+i); x[cnt++]=u[i]; x[cnt++]=++v[i]; } sort(x,x+cnt); cnt=unique(x,x+cnt)-x; for(int i=0;i<n;i++){ u[i]=lower_bound(x,x+cnt,u[i])-x+1; v[i]=lower_bound(x,x+cnt,v[i])-x+1; } int s=0,t=cnt+1; for(int i=0;i<t;i++){ add(i,i+1,0,2); add(i+1,i,0,0); } for(int i=0;i<n;i++){ add(u[i],v[i],-w[i],1); add(v[i],u[i],-w[i],-1); } printf("%d\n",-mcmf(s,t)); } return 0; }
时间: 2024-11-07 11:25:27