题解:

暴力枚举

然后网络流

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int E=,V=,inf=0xffff;
struct Edge{int u,v,c,next;}edge[E];
int a,bb,c,d,p[V],r,b,t,n,m,cnt,cou,dist[V],head[V],que[V],fb[],sta[V];
void init()
{
cnt=;
memset(head,-,sizeof(head));
}
void jb(int u,int v,int c)
{
edge[cnt].u=u;edge[cnt].v=v;edge[cnt].c=c;
edge[cnt].next=head[u];head[u]=cnt++;
edge[cnt].u=v;edge[cnt].v=u;edge[cnt].c=;
edge[cnt].next=head[v];head[v]=cnt++;
}
int dinic(int s,int t)
{
int ans=;
while()
{
int left,right,u,v;
memset(dist,-,sizeof(dist));
left=right=;
que[right++]=s;
dist[s]=;
while (left<right)
{
u=que[left++];
for (int k=head[u];k!=-;k=edge[k].next)
{
u=edge[k].u;
v=edge[k].v;
if (edge[k].c> && dist[v]==-)
{
dist[v]=dist[u]+;
que[right++]=v;
if(v==t)
{
left=right;
break;
}
}
}
}
if (dist[t]==-) break;
int top=,now=s;
while ()
{
if (now!=t)
{
int k;
for (k=head[now];k!=-;k=edge[k].next)
if (edge[k].c>&&dist[edge[k].u]+==dist[edge[k].v]) break;
if (k!=-)
{
sta[top++]=k;
now=edge[k].v;
}
else
{
if (top==) break;
dist[edge[sta[--top]].v]=-;
now=edge[sta[top]].u;
}
}
else
{
int flow=inf,ebreak;
for (int i=;i<top;i++)
if (flow>edge[sta[i]].c)
{
flow=edge[sta[i]].c;
ebreak=i;
}
ans+=flow;
for (int i=;i<top;i++)
{
edge[sta[i]].c-=flow;
edge[sta[i]^].c+=flow;
}
now=edge[sta[ebreak]].u;
top=ebreak;
}
}
}
return ans;
}
struct T{int u,v,c;}road[E],bridge[E],tunnel[E];
struct R{int num,cost;}res[E];
void build()
{
init();
for (int i=;i<=n;i++)jb(,i,p[i]);
for (int i=;i<r;i++)jb(road[i].u,road[i].v,inf);
for (int i=;i<t;i++)
{
jb(tunnel[i].u,n+i+,inf);
jb(n+i+,tunnel[i].v,inf);
jb(n+i+,n+t+,tunnel[i].c);
}
}
void dfs(int s)
{
if (s==b)
{
int sum=;
build();
for (int i=;i<b;i++)
{
if (fb[i]==)
{
jb(bridge[i].u,bridge[i].v,);
sum+=;
}
else
{
jb(bridge[i].u,bridge[i].v,inf);
sum+=bridge[i].c;
}
}
res[cou].num=dinic(,n+t+);
res[cou++].cost=sum;
return ;
}
fb[s]=;
dfs(s+);
fb[s]=;
dfs(s+);
}
int main()
{
while (~scanf("%d%d",&n,&m))
{
for (int i=;i<=n;i++)scanf("%d",&p[i]);
r=b=t=;
for (int i=;i<=m;i++)
{
scanf("%d%d%d%d",&a,&bb,&c,&d);
if (d<)
{
tunnel[t].u=a;
tunnel[t].v=bb;
tunnel[t++].c=c;
}
if (d==)
{
road[r].u=a;
road[r++].v=bb;
}
if (d>)
{
bridge[b].u=a;
bridge[b].v=bb;
bridge[b++].c=c;
}
}
memset(fb,,sizeof(fb));
for (int i=;i<;i++)res[i].cost=res[i].num=;
cou=;dfs();
int minc=inf,maxc=-;
for (int i=;i<cou;i++)
if (res[i].num>maxc)maxc=res[i].num;
for (int i=;i<cou;i++)
if (res[i].num==maxc)
if (res[i].cost<minc)minc=res[i].cost;
if (maxc==) puts("Poor Heaven Empire");
else printf("%d %d\n",maxc,minc);
}
return ;
}

hdu4309的更多相关文章

随机推荐

  1. Winter-1-B Sum 解题报告及测试数据

    Time Limit:500MS Memory Limit:32768KB Description ​Hey, welcome to HDOJ(Hangzhou Dianzi University O ...

  2. Python中常用技巧整理

    Python中os.path的妙用  http://xpleaf.blog.51cto.com/9315560/1736956

  3. 对Docker的一点理解

    Docker是什么? Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来.并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会相互影响.那么就不需要专门 ...

  4. C++之条形码,windows下zint库的编译及应用(二)

    zint库是一个开源的第三方库,提供了生成条形码.二维码等功能.本文主要介绍zint库的生成及简单应用.   0windows下zint库的编译及应用(一)   工具/原料   vs2012 生成条形 ...

  5. [转]eclipse 配置黑色主题 Luna 方式三

      虽然以前也使用eclipse的黑色主题,但是配置起来稍微麻烦一点. 这里先声明,下面的方式适合最新版本的Eclipse Luna,旧的版本可以下载我提供的这个插件,并将其放在eclipse目录下的 ...

  6. Python3.x:chrome运行webdriver脚本提示--ignore-certificate-errors

    Python3.x:chrome运行webdriver脚本提示--ignore-certificate-errors 1,分析原因: 根本原因是Chromedriver和Chrome的版本不兼容: 网 ...

  7. 一篇关于cfDNA的综述

    文章题目:A Field Guide for Cancer Diagnostics using cell-free DNA: from Principles to Practice and Clini ...

  8. 20145312 《Java程序设计》第三周学习总结

    20145312 <Java程序设计>第三周学习总结 学习笔记 Chapter 4 4.1类与对象 4.1.1 定义类 1.以服饰设计为例,类定义用class关键词,建立衣服实例要用new ...

  9. Docker storage drivers

    因为Docker的镜像是分层的,包含只读层和可读写层,因此选择正确的Storage Driver对于容器的性能是非常重要的. 支持的Linux发行版本 目前推荐使用性能最好的Overlay2.RHEL ...

  10. openwrt中的append-ubi定义在哪里

    include/image-commands.mk 定义如下: define Build/append-ubi sh $(TOPDIR)/scripts/ubinize-image.sh \ $(if ...