hdu4309
题解:
暴力枚举
然后网络流
代码:
#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的更多相关文章
随机推荐
- JVM(3) 垃圾回收器与内存分配策略
文章内容摘自:深入理解java虚拟机 第三章 对象已死? 1. 引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0 ...
- Oracle中的substr()函数详解案例
1)substr函数格式 (俗称:字符截取函数) 格式1: substr(string string, int a, int b); 格式2:substr(string string, int a ...
- 【Head First Servlets and JSP】笔记 26: web 应用部署
物理目录结构与虚拟目录结构的差异 WAR 实际上就是 JAR 什么东西应该放在 WEB-INF 文件夹下? <mime-mapping> 相关 <env-entry> 相关 [ ...
- 一.复习GCC编译器的用法
1.复习GCC编译器的用法 欲善其工,那么要先利其器.在这个C语言巩固与提高的阶段中,如果想要更好的达成预期目标,首先就要熟练掌握GCC编译器的用法.以下是GCC相关知识: GCC使用语法 gcc 选 ...
- path.join()和path.resolve()的区别
现在写代码的时候有时候使用path.join(__dirname,'dist')有时候用path.resolve(__dirname,'dist'),都是能拼接处来一个绝对路径,但是具体有什么区别呢? ...
- 20145313Java第一次实验
实验内容 1.JVM.JRE.JDK的安装位置与区别: 2.命令行运行javac:java:javac -cp; java -cp: 3.PATH,CLASSPATH,SOURCEPATH的设定方法与 ...
- linux网络连接的查看和端口的监听
网络软件都是由客户端和服务端组成,由服务端在服务器上监听指定的端口处理接收到的数据,而客户端是向服务器端监听的端口发送数据,并由服务器端对该数据进行处理,然后将处理结果返回给客户端. 那么我们在lin ...
- CSS样式 vertical-align:middle 垂直居中生效情况
vertical-align:middle 是依赖div内子元素最高的行高来实现对某元素居中的 -------不存在浮动时可以直接生效垂直居中 HTML .box1{ display: table- ...
- python find命令、startwith命令
python的字符串有很多好用的操作,比如find,startswith命令. 这几个命令在处理配置文件的时候很有用,比如用startswith判断是否是注释行. 注意:几个函数的返回值是不同滴. 函 ...
- ubuntu如何U盘启 动制作
先到出 U盘的位置, 方法有很多,terminal 用root权限,采用fdisk -f 命令 unmount /dev/sdb -I //U盘拨出 sdb为U盘挂载的位置 mkfs.fat /dev ...