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
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- 关于spark的结构流程图
- [sqlServer]sqlServer存储过程的常见语法
- Psoc Creator入门——EZI2C 通信
- spring boot小记
- [LeetCode]504. Base 7
- ZOJ
- mySql学习笔记<定义一个mysql过程>
- 蓝桥杯-回文数(java)
- 如何用Maven创建web项目(具体步骤)
- Jax 与Webservice
- Linux 信 号 机 制
- XML 之解析之SAX解析器
- Python Re库
- PAT-A-1009. Product of Polynomials (25)