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的更多相关文章
随机推荐
- cdoj1633 去年春恨却来时,落花人独立,微雨燕双飞
地址:http://acm.uestc.edu.cn/#/problem/show/1633 题目: 去年春恨却来时,落花人独立,微雨燕双飞 Time Limit: 3000/1000MS (Java ...
- lightGallery 一个视屏不播放 解决方法
这次使用了lightGallery,感觉还不错.样式比较美观,并且支持响应式. 使用过程中,我遇到了下面的问题: 当我 .picsgallery里面只有一个 .gItem的时候.点击弹出幻灯片,再点击 ...
- Windows打开软件老是弹出无法验证发布者
使用组策略管理器 gpedit.msc 用户配置-管理模板-Windows组件-附件管理器-中等风险文件类型的包含列表 .exe;.cmd;.bat;.js即可
- Vue数据绑定失效
首先,我们得明白Vue数据响应的原理: 以对象为例:当把一个JavaScript对象传给Vue实例的data选项时,Vue将遍历此对象所有的属性,并使用Object.defineProperty把这些 ...
- 20145331 《Java程序设计》第4周学习总结
20145331 <Java程序设计>第4周学习总结 教材学习内容总结 •第六章 1.继承的定义与特点: 子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承方法, ...
- 20145109 实验四 Andoid开发基础
安装Android 打开 默认程序中有helloworld 按下下图红框中的键: 遇到问题: 方法:修改build.gradle
- obtainBuffer timed out (is the CPU pegged?)
https://stackoverflow.com/questions/5293025/audiotrack-lag-obtainbuffer-timed-out [典] 03-13 14:55:57 ...
- STS,MyEclipse中Maven配置
本文以STS的环境做讲解,MyEclipse环境和STS差别不大,配置过程相似. STS是解压版的,启动后,可以看到已经有了Maven插件,, 但是,STS也同时给你了一个Maven,但是通常不建议使 ...
- JAVA链接数据库
链接:http://www.cnblogs.com/centor/p/6142775.html 开发工具: MyEclipse MySQL JDBC驱动:mysql-connector-java-5. ...
- POJ2159 ancient cipher - 思维题
2017-08-31 20:11:39 writer:pprp 一开始说好这个是个水题,就按照水题的想法来看,唉~ 最后还是懵逼了,感觉太复杂了,一开始想要排序两串字符,然后移动之类的,但是看了看 好 ...