Shoot the Bullet ZOJ - 3229有上下界网络流
Code:
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=2005;
const int maxd=1000000+233;
const int INF=10000000;
# define pb push_back
int sss,ttt;
int s,t;
int E1,E2;
int mapp[maxd],A[maxn],val[maxd];
struct Edge{
int from,to,cap;
Edge(int u,int v,int c):from(u),to(v),cap(c) {}
};
vector<Edge>edges;
struct Dicnic{
vector<int>G[maxn];
int d[maxn],vis[maxn],cur[maxn];
queue<int>Q;
void init(){
for(int i=0;i<maxn;++i)G[i].clear();
edges.clear();
}
void addedge(int u,int v,int c,int cnt)
{
edges.pb(Edge(u,v,c));
edges.pb(Edge(v,u,0));
int m=edges.size();
G[u].pb(m-2); //正向弧
G[v].pb(m-1); //反向弧
E1=m-2,E2=m-1;
if(cnt>0)mapp[cnt]=m-1;
}
int BFS()
{
memset(vis,0,sizeof(vis));
d[s]=0,vis[s]=1;Q.push(s);
while(!Q.empty())
{
int u=Q.front();Q.pop();
int sz=G[u].size();
for(int i=0;i<sz;++i){
Edge e=edges[G[u][i]];
if(!vis[e.to]&&e.cap>0&&e.to!=sss&&e.to!=ttt){
d[e.to]=d[u]+1,vis[e.to]=1;
Q.push(e.to);
}
}
}
return vis[t];
}
int dfs(int x,int a)
{
if(x==t)return a;
int sz=G[x].size();
int f,flow=0;
for(int i=cur[x];i<sz;++i)
{
Edge e=edges[G[x][i]];
cur[x]=i;
if(d[e.to]==d[x]+1&&e.cap>0&&e.to!=sss&&e.to!=ttt)
{
f=dfs(e.to,min(a,e.cap));
if(f)
{
int u=G[x][i];
a-=f;
edges[u].cap-=f;
edges[u^1].cap+=f;
flow+=f;
if(a==0)break;
}
}
}
return flow;
}
int maxflow(){
int ans=0;
while(BFS()){
memset(cur,0,sizeof(cur));
ans+=dfs(s,INF);
}
return ans;
}
}op;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
op.init();
memset(A,0,sizeof(A));
int sum=0,cnt=0,ss,tt;
ss=0,tt=n+m+1;
for(int i=0;i<m;++i){
int a;scanf("%d",&a);
op.addedge(n+1+i,tt,INF-a,0);
A[n+1+i]-=a,A[tt]+=a;
}
for(int i=1;i<=n;++i){
int c,d;scanf("%d%d",&c,&d);
op.addedge(ss,i,d,0);
for(int j=1;j<=c;++j)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
++cnt;
op.addedge(i,x+n+1,z-y,cnt);
val[cnt]=y;
A[i]-=y,A[x+n+1]+=y;
}
}
s=1500,t=1501;
for(int i=0;i<=n+m+1;++i)
{
if(A[i]>0){op.addedge(s,i,A[i],0);sum+=A[i];}
if(A[i]<0)op.addedge(i,t,-A[i],0);
}
op.addedge(tt,ss,INF,0);
sss=-1,ttt=-2;
int ans1=op.maxflow();
sss=1500,ttt=1501;
if(ans1!=sum){printf("-1\n");printf("\n");}
else
{
ans1=edges[E2].cap;
edges[E1].cap=edges[E2].cap=0;
s=ss,t=tt;
ans1+=op.maxflow();
printf("%d\n",ans1);
for(int i=1;i<=cnt;++i)
printf("%d\n",edges[mapp[i]].cap+val[i]);
printf("\n");
}
return 0;
}
Shoot the Bullet ZOJ - 3229有上下界网络流的更多相关文章
- Shoot the Bullet ZOJ - 3229 有源汇有上下界的最大流
/** zoj提交评判不了,所以不知道代码正不正确.思路是应该没问题的.如果有不对的地方,请多指教. 题目:Shoot the Bullet ZOJ - 3229 链接:https://vjudge. ...
- ZOJ 3229 有上下界最大流
1: /** 2: ZOJ 3229 有上下界的最大流 3: 两次求最大流的过程,非二分 4: 有源汇上下界的最大流问题, 首先连接 sink -> src, [0,INF]. 5: 根据net ...
- zoj 3229 Shoot the Bullet(有源汇上下界最大流)
Shoot the Bullethttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3442 Time Limit: 2 Second ...
- Shoot the Bullet(有源汇带上下界最大流)
有源汇带上下界最大流 在原图基础上连一条汇点到源点流量为inf的边,将有源汇网络流转化为无源汇网络流用相同方法判断是否满流,如果满流再跑一边源点到汇点的最大流就是答案 例题:Shoot the Bul ...
- zoj3229 Shoot the Bullet(有源汇有上下界的最大流)
题意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给给定的C个女神拍照,每天拍照数不能超过D张,而且给每个女神i拍照有数量限制[Li,Ri],对于每个女神n天的拍照总和不能少于Gi,如果有解求屌 ...
- ZOJ3229 Shoot the Bullet(有源汇的上下界最大流)
#pragma warning(disable:4996) #include <iostream> #include <cstring> #include <string ...
- ZOJ Problem Set - 3229 Shoot the Bullet 【有上下界网络流+流量输出】
题目:problemId=3442" target="_blank">ZOJ Problem Set - 3229 Shoot the Bullet 分类:有源有汇 ...
- 【有上下界网络流】【ZOJ】2314 Reactor Cooling
[算法]有上下界网络流-无源汇(循环流) [题解]http://www.cnblogs.com/onioncyc/p/6496532.html //未提交 #include<cstdio> ...
- ZOJ 3496 Assignment | 二分+有上下界网络流
题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3496 大概意思:给你一个网络,有源汇,在保证最大流的情况下求下面两 ...
随机推荐
- UOJ #131 BZOJ 4199 luogu P2178【NOI2015】品酒大会 (后缀自动机、树形DP)
水是水,但是写出了不少问题,因此写一发博客. https://www.luogu.org/problemnew/show/P2178 https://www.lydsy.com/JudgeOnline ...
- java里面的队列
非阻塞无界队列 ConcurrentLinkedQueue public static void main(String[] args) throws InterruptedException { ...
- [bzoj1090][SCOI2003]字符串折叠_区间dp
字符串折叠 bzoj-1090 SCOI-2003 题目大意:我说不明白...链接 注释:自己看 想法:动态规划 状态:dp[i][j]表示从第i个字符到第j个字符折叠后的最短长度. 转移:dp[l] ...
- windows终端 进入文件夹
盘符: 例如想进入D盘 d: cd 进入到当前盘某个目录.cd \ 进入当前盘根目录cd \windows 进入到当前盘Windows目录cd.. 退出到上一级目录 注:进入含有特殊字符目录时需要加引 ...
- Cocos Code IDE里xcodeprojectlua脚本更新
lua脚本改动后xcode须要clean又一次编译才干更新,这个是xcode里的老毛病了,网上有一些脚本但不是针对Cocos Code IDE的project文件夹的,这里列出 cocos2dx版本号 ...
- js限制checkbox选中个数
今天在做项目时,碰到一个问题,我须要展示多个checkbox复选框,而仅仅能同意最多选6个.调试了老半天.最终出来了,代码例如以下: <SCRIPT LANGUAGE="JavaScr ...
- How to fix yum errors on CentOS, RHEL or Fedora
Yum is a package management tool for installing, updating and removing rpm packages on RedHat-based ...
- 根据日期获取,x岁x月x天
c#: DateTime startDate = new DateTime(); DateTime endDate = new DateTime(); ; ; ; if (endDate.Month& ...
- jQuery右键菜单contextMenu实例
URL: http://www.cnblogs.com/whitewolf/archive/2011/09/28/2194795.html http://www.blogjava.net/superc ...
- [Javascript] 轻量级的JavaScript日期处理类库xDate使用指南
XDate是一个请谅解的JavaScript的原生Date对象的封装库,提供增强的功能解析,格式化和日期处理.使用起来就和JavaScript自己的对象和方法一样,非常简单. XDate是一个请谅解的 ...