http://acm.hdu.edu.cn/showproblem.php?pid=4309

总结:边可存东西时,可新建一个点x连接u、v,x再连向汇点;

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
#define pb push_back
const ll INF=1e18;
const int inf=0x3f3f3f3f;
const int M=1e5+;
const int N=1e5+; int a[M],head[M],cur[M],deep[M],s,t,tot,firnum,secnum,thnum;
struct node{
int v,w,nextt;
}e[N];
struct Node{
int u,v,w,cost;
}fir[M],sec[M],th[M];
void addedge(int u,int v,int w){
e[tot].v=v;
e[tot].w=w;
e[tot].nextt=head[u];
head[u]=tot++;
e[tot].v=u;
e[tot].w=;
e[tot].nextt=head[v];
head[v]=tot++; }
bool bfs(){
for(int i=;i<=t;i++)
deep[i]=;
queue<int>que;
que.push(s);
deep[s]=;
while(!que.empty()){
int u=que.front();
que.pop();
for(int i=head[u];~i;i=e[i].nextt){
int v=e[i].v;
if(e[i].w>&&deep[v]==){
deep[v]=deep[u]+;
if(v==t)
return true;
que.push(v);
}
}
}
return deep[t]==?false:true;
}
int dfs(int u,int fl){
if(u==t)
return fl;
int x,res=;
for(int i=cur[u];~i;i=e[i].nextt){
int v=e[i].v;
if(e[i].w>&&deep[v]==deep[u]+){
x=dfs(v,min(fl-res,e[i].w));
res+=x;
e[i].w-=x;
e[i^].w+=x;
if(e[i].w)
cur[u]=;
if(res==fl)
return fl;
}
}
if(res==)
deep[u]=;
return res;
}
int dinic(){
int res=;
while(bfs()){
for(int i=;i<=t;i++)
cur[i]=head[i];
res+=dfs(s,inf);
}
return res;
}
int n,ans,ansmin,mincost;
void init(){
memset(head,-,sizeof(head));
tot=;
mincost=;
}
void solve(int now){
init();
for(int i=;i<=n;i++)
addedge(s,i,a[i]);
for(int i=;i<firnum;i++){
addedge(fir[i].u,n++i,inf);
addedge(n++i,fir[i].v,inf);
addedge(n++i,t,fir[i].w);
}
for(int i=;i<secnum;i++){
addedge(sec[i].u,sec[i].v,inf);
}
for(int i=;i<thnum;i++){
if(now & (<<i) ){
addedge(th[i].u,th[i].v,inf);
mincost+=th[i].cost;
}
else
addedge(th[i].u,th[i].v,);
}
int nowans=dinic();
if(nowans > ans){
ans = nowans;
ansmin = mincost;
}else if(nowans == ans){
ansmin=min(ansmin,mincost);
}
}
int main(){
int m;
while(scanf("%d%d",&n,&m)!=EOF){
ans=;
ansmin=inf;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
firnum=secnum=thnum=;
s=;
t=n+;
for(int u,v,w,p,i=;i<=m;i++){
scanf("%d%d%d%d",&u,&v,&w,&p);
if(p<){
fir[firnum].u=u;
fir[firnum].v=v;
fir[firnum].w=w;
firnum++;
t++;
//addedge(v,t,inf,0); }
else if(p==){
sec[secnum].u=u;
sec[secnum].v=v;
secnum++;
}
else{
th[thnum].u=u;
th[thnum].v=v;
th[thnum].cost=w;
thnum++;
}
}
//cout<<firnum<<":"<<secnum<<":"<<thnum<<endl;
for(int i=;i<=(<<thnum)-;i++)
solve(i); if(ans==)
puts("Poor Heaven Empire");
else
printf("%d %d\n",ans,ansmin);
//puts("");
}
return ;
}

最新文章

  1. OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别
  2. 【Fine原创】JMeter分布式测试中踩过的那些坑
  3. C#如何利用QQ邮箱SMTP发送邮件
  4. JS-鼠标经过显示二级菜单
  5. Atitit org.eclipse.jdt&#160;的ast 架构 Eclipse JDT API&#160;spec
  6. [转]gdb结合coredump定位崩溃进程
  7. 通过MYSQL命令行直接建数据库
  8. iOS UIWebView 之 UIProgressView
  9. 10个鲜为人知的C#关键字
  10. 【java】读取资源文件key-&gt;value,java.util.ResourceBundle
  11. C语言货架02
  12. SQL学习 存储过程&amp;DUAL表
  13. JTA事务管理
  14. linux audit审计(2)--audit启动
  15. 快速上手Git
  16. boost::asio 学习
  17. 卸载Myeclipse10.5 报错“an error has occured.See the log file ...Uninstaller\...”
  18. 前端学习 -- Css -- 浮动
  19. HDU5919 SequenceⅡ
  20. [BZOJ3924][ZJOI2015]幻想乡战略游戏(动态点分治)

热门文章

  1. Tensorflow学习教程------普通神经网络对mnist数据集分类
  2. Tensorflow学习教程------变量
  3. Mybatis框架的简单配置
  4. 桥接 brctl
  5. no.10京东咚咚架构演讲读后感
  6. 吴裕雄--天生自然MySQL学习笔记:MySQL 事务
  7. PAT Advanced 1099 Build A Binary Search Tree (30) [⼆叉查找树BST]
  8. 最大连续子序列和,以及开始、结束下标(HDU 1003)
  9. 增删改查(简单版&amp;连接数据库)
  10. CodeForces 382B 数学推导