题目链接点这里
毒瘤题,,wa了无数发,,,才发现当m==0的时候,,会输出一些奇怪的东西。。。
以后,,不管什么题都要记得特判,,恩,,,不然会死的很惨。。
#include
#include
#include
#include
#include
using namespace std;
#define mem(x,y) memset(x,y,sizeof(x))
#define FIN freopen("input.txt","r",stdin)
#define fuck(x) cout< Q;
Q.push(s);
vis[s]=1;
d[s]=0;
d[t]=-1;
while(!Q.empty())
{
LL u=Q.front();
Q.pop();
for(LL i=head[u]; ~i; i=E[i].nxt)
{
LL v=E[i].to;
if(vis[v]||!E[i].cap) continue;
d[v]=d[u]+1;
vis[v]=1;
Q.push(v);
}
}
return d[t]!=-1;
}
LL DFS(LL x,LL t,LL a)
{
if(x==t||a==0) return a;
LL flow=0,f;
for(LL &i=cur[x]; ~i; i=E[i].nxt)
{
LL v=E[i].to;
if(d[v]==d[x]+1&&(f=DFS(v,t,min(a,E[i].cap))))
{
E[i].cap-=f;
E[i^1].cap+=f;
flow+=f;
a-=f;
if(a==0) break;
}
}
return flow;
}
LL Dinic(LL s,LL t)
{
LL flow=0;
while(BFS(s,t))
{
memcpy(cur,head,sizeof(head));
flow+=DFS(s,t,INF);
}
return flow;
}
LL w[MX][3];
LL num[MX];
LL check1(LL k)
{
edge_init();
for(LL i=1; i<=m; i++)
{
edge_add(w[i][0],w[i][1],min(w[i][2],k));
edge_add(w[i][1],w[i][0],0);
}
return Dinic(s,t);
}
LL ans;
LL erfeng1(LL l,LL r)
{
LL m;
while(l>1;
if(check1(m)==ans)r=m;
else l=m+1;
}
return p*l;
}
LL check2(LL k)
{
edge_init();
edge_add(t,s,INF);
edge_add(s,t,0);
for(LL i=1; i<=m; i++)
{
if(w[i][2]-k<0)return ans-1;
edge_add(w[i][0],w[i][1],w[i][2]-k);
edge_add(w[i][1],w[i][0],0);
}
LL S=n,T=n+1,sum=0;
for(LL i=0; i0)edge_add(S,i,k*num[i]),edge_add(i,S,0),sum+=k*num[i];
else if(num[i]<0) edge_add(i,T,-k*num[i]),edge_add(T,i,0);
}
if(sum!=Dinic(S,T)) return ans-1;
return Dinic(s,t);
}
LL erfeng2(LL l,LL r )
{
LL m;
while(l>1)+1;
if(check2(m)==ans)l=m;
else r=m-1;
}
return p*l;
}
int main()
{
FIN;
LL cas;
cin>>cas;
while(cas--)
{
mem(num,0);
scanf("%lld%lld%lld%lld%lld",&n,&m,&s,&t,&p);
LL l=INF,r=0;
for(LL i=1; i<=m; i++)
{
scanf("%lld%lld%lld",&w[i][0],&w[i][1],&w[i][2]);
num[w[i][0]]--;
num[w[i][1]]++;
l=min(l,w[i][2]);
r=max(r,w[i][2]);
}
if(m)
{
ans=check1(r);
printf("%lld %lld\n",erfeng1(0,r),erfeng2(0,l));
}
else printf("0 0\n");
}
return 0;
}