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的更多相关文章
随机推荐
- CodeForces - 528D Fuzzy Search (FFT求子串匹配)
题意:求母串中可以匹配模式串的子串的个数,但是每一位i的字符可以左右偏移k个位置. 分析:类似于 UVALive -4671. 用FFT求出每个字符成功匹配的个数.因为字符可以偏移k个单位,先用尺取法 ...
- Python之路——线程池
1 线程基础 1.1 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2 线程同步——锁 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样,其实Python中是伪多线程).但是当线程 ...
- 日志处理(三) logback 手动加载(转)
本文转自:http://www.2cto.com/kf/201302/191149.html 一共两个java文件,第一个是例子,第二个是配置文件加载类; LogbackTest.java /* * ...
- iOS APP 新增表情包拓展
图示教程如下:
- HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成数据的增删改查
转:http://www.th7.cn/db/nosql/201510/135382.shtml 1. HDFS的文件append功能 早期版本的HDFS不支持任何的文件更新操作,一旦一个文件创建.写 ...
- centos7 安装 gitolite (git服务器)
gitolite简介 轻量级git服务器程序,解决了git权限管理的问题.(git是一个分布式版本控制系统,就是说每个人作为客户端的同时又是服务器)项目GitHub地址:https://github. ...
- Camera帧率和AE的关系
1.camera首先是通过曝光的pixel加上dummy pixel以及曝光的line加上dummy line来决定一帧的曝光时间,这一帧曝光时间的倒数就是帧率,这个没有错吧,但是看代码时候看到pre ...
- python 打印 九九表
用Python 打印九九表. print 每打印一行默认会带有换行, 在print语句后加上,end = 't' 会变成tab. 排版会好点. def main(): for i in range(1 ...
- Django学习笔记之Django ORM相关操作
一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...
- Python面试题之functools模块
文档 地址 functools.partial 作用: functools.partial 通过包装手法,允许我们 "重新定义" 函数签名 用一些默认参数包装一个可调用对象,返回结 ...