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 ;
}

Seikimatsu Occult Tonneru(网络流,状态数(建不建边)不多时,可考虑直接进行枚举的更多相关文章

  1. HDU 4309 Seikimatsu Occult Tonneru

    Seikimatsu Occult Tonneru Time Limit: 6000ms Memory Limit: 32768KB This problem will be judged on HD ...

  2. HDU 4309 Seikimatsu Occult Tonneru (状压 + 网络流)

    题意:输入 n 个城市 m 条边,但是边有三种有向边 a b  c d,第一种是 d 是 0,那么就是一条普通的路,可以通过无穷多人,如果 d < 0,那么就是隧道,这个隧道是可以藏 c 个人, ...

  3. HDU 4309 Seikimatsu Occult Tonneru 网络流量+像缩进

    主题链接:点击打开链接 意甲冠军: 题意:给出一张N(N<=100)个点,M(M<=1000条)边的有向图. 每一个点上都有一些人.每条边有4个属性(u,v,w,p). 这些边分为三种:( ...

  4. HDU 4309 Seikimatsu Occult Tonneru(最大流+二进制枚举)

    http://acm.hdu.edu.cn/showproblem.php?pid=4309 题意: 有n个城市,每个城市有num[i]个居民,有敌人要进行地毯式轰击,居民们要逃到隧道去.现在有隧道, ...

  5. HDU4309-Seikimatsu Occult Tonneru(最大流)

    Seikimatsu Occult Tonneru Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  6. [NewLife.XCode]反向工程(自动建表建库大杀器)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...

  7. Mac下安装MySQL、Workbench以及建数据库建表最基础操作

    刚用上Mac,什么都不懂,加之以前还没有用过mysql,就想着在Mac上装一个mysql来自己玩,奈何,在网上找了大半天,没有一个干货!愤怒!下面是我安装的过程,希望能帮到和我情况差不多的朋友   首 ...

  8. MySQL建库建表

    一直使用SQL SERVER 数据库:最近项目使用MY SQL感觉还是有一点不适应.不过熟悉之后就会好很多. MY SQL 安装之后会有一个管理工具MySQL Workbench 感觉不太好用,数据库 ...

  9. 【ITOO 2】.NET 动态建库建表:使用SQL字符串拼接方式

    导读:在最近接手的项目(高效云平台)中,有一个需求是要当企业用户注册时,给其动态的新建一个库和表.刚开始接手的时候,是一点头绪都没有,然后查了一些资料,也问了问上一版本的师哥师姐,终于有了点头绪.目前 ...

随机推荐

  1. Multiarmed Bandit Algorithm在股票中的应用

    股票与Bandit Machine看起来相去甚远,但实际上通过限制买入和卖出的行为,股票可以转换为Bandit Machine,比如:规定股票必须在买入一天以后卖出.为什么要大费周折地把股票变成Ban ...

  2. 使用Object类为实例定义方法和属性

    1.1 可以使用 Object 类直接定义个实例,并且为该对象赋属性和方法,例如: var person_1 = { nickName:"xiaowu", age:28, show ...

  3. find_element_by_xpath()的6种方法

    Xpath (XML Path Language),是W3C定义的用来在XML文档中选择节点的语言 一:从根目录/开始 有点像Linux的文件查看,/代表根目录,一级一级的查找,直接子节点,相当于cs ...

  4. SeetaFaceQt:Qt多线程

    为什么要做多线程,说个最简单的道理就是我们不希望在软件处理数据的时候界面处于无法响应的假死状态.有些处理是灰常花时间的,如果把这样的处理放到主线程中执行,就会导致软件一条路走到底,要等到处理完才能接收 ...

  5. scrapy 在pycharm中调试 不用到命令行中启动爬虫方法

    (目录结构如上图) 在主目录中加入main.py,在其中加入代码,运行此文件就可以运行整个爬虫: # -*- coding: utf-8 -*- __author__='pasaulis' #在程序中 ...

  6. PAT Advanced 1102 Invert a Binary Tree (25) [树的遍历]

    题目 The following is from Max Howell @twitter: Google: 90% of our engineers use the sofware you wrote ...

  7. Django1.11创建

    Djiango 1.11.1 虚拟环境配置 创建虚拟环境 mkvirtualenv 虚拟环境名字 -p python3 安装django pip install django==1.11.11 卸载包 ...

  8. centos6.5源码升级内核

    centos6.5源码升级内核 升级前 系统版本:  CentOS5.5 内核版本:  2.6.18-194.el5 升级前做过简单配置文件修改 yum -y upgrade    升级后 系统版本: ...

  9. jQuery如何给DOM添加ID

    ID每个元素只能有一个,ID名同一页面也不能重复,addID方法是不需要的,和其他属性一样用attr方法就行了, $(singleTarget).attr('id','idName'); 更简单的 $ ...

  10. 堆排序算法以及python实现

    堆满足的条件:1,是一颗完全二叉树.2,大根堆:父节点大于各个孩子节点.每个节点都满足这个道理.小根堆同理. parent = (i-1)/2    #i为当前节点 left = 2*i+1 righ ...