ZOJ

来源:互联网 发布:ibatis批量update sql 编辑:程序博客网 时间:2024/04/30 22:45

题目链接点这里


毒瘤题,,wa了无数发,,,才发现当m==0的时候,,会输出一些奇怪的东西。。。

以后,,不管什么题都要记得特判,,恩,,,不然会死的很惨。。

#include<algorithm>#include<iostream>#include<cstring>#include<queue>#include<cstdio>using namespace std;#define mem(x,y) memset(x,y,sizeof(x))#define FIN freopen("input.txt","r",stdin)#define fuck(x) cout<<x<<endlconst int MX=211111;#define INF 0x3f3f3f3f3f3f3f3f#define lson l,m,rt<<1typedef long long LL;#define rson m+1,r,rt<<1|1LL n,m;LL s,t,p;LL head[MX],cnt;struct Edge{    LL nxt,to,cap;} E[2*MX];void edge_init(){    mem(head,-1);    cnt=0;}void edge_add(LL u,LL v,LL cap){    E[cnt].nxt=head[u];    E[cnt].to=v;    E[cnt].cap=cap;    head[u]=cnt++;}bool vis[MX];LL d[MX],cur[MX];bool BFS(LL s,LL t){    mem(vis,0);    queue<LL> 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<r)    {        m=(l+r)>>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; i<n; i++)    {        if(num[i]>0)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<r)    {        m=((l+r)>>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;}


0 0