HDU4309-Seikimatsu Occult Tonneru(最大流)
Seikimatsu Occult Tonneru
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1741 Accepted Submission(s): 438
There are N cities in Heaven Empire, where people live, with 3 kinds of directed edges connected with each other. The 1st kind of edges is one of Great Tunnels( no more than 20 tunnels) where a certain number of people can hide here; people can also go through
one tunnel from one city to another. The 2nd kind of edges is the so-called Modern Road, which can only let people go through. The 3rd kind of edges is called Ancient Bridge and all the edges of this kind have different names from others, each of which is
named with one of the twelve constellations( such as Libra, Leo and so on); as they were build so long time ago, they can be easily damaged by one person's pass. Well, for each bridge, you can spend a certain deal of money to fix it. Once repaired, the 3rd
kind of edges can let people pass without any limitation, namely, you can use one bridge to transport countless people. As for the former two kinds of edges, people can initially go through them without any limitation.
We want to shelter the most people with the least money.
Now please tell me the largest number of people who can hide in the Tunnels and the least money we need to spend to realize our objective.
The first line, two integers: N (N<=100), m (m<=1000). They stands for the number of cities and edges.
The next line, N integers, which represent the number of people in the N cities.
Then m lines, four intergers each: u, v, w, p (1<=u, v<=N, 0<=w<=50). A directed edge u to v, with p indicating the type of the edge: if it is a Tunnel then p < 0 and w means the maximum number people who can hide in the the tunnel; if p == 0 then it is a Modern
Road with w means nothing; otherwise it is an Ancient Bridge with w representing the cost of fixing the bridge. We promise there are no more than one edge from u to v.
4 4
2 1 1 0
1 2 0 0
1 3 0 0
2 4 1 -1
3 4 3 -1 4 4
2 1 1 0
1 2 0 0
1 3 3 1
2 4 1 -1
3 4 3 -1
4 0
4 3
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 100+10;
const int maxm = 1000+10;
const int inf = 1<<25;
int n,m,nume;
struct edge{
int v,f,nxt;
};
struct build{
int u,v,w;
build(int u,int v,int w):u(u),v(v),w(w){}
};
vector<build> vb[3];
edge e[maxm];
int head[maxn];
int city[maxn];
void addedge(int u,int v,int c){
e[++nume].nxt = head[u];
e[nume].v = v;
e[nume].f = c;
head[u] = nume;
e[++nume].nxt = head[v];
e[nume].v = u;
e[nume].f = 0;
head[v] = nume;
}
void init(){
memset(head,0,sizeof head);
nume = 1;
} queue<int> que;
bool vis[maxn];
int dist[maxn];
int src,sink; void bfs(){
memset(dist,0,sizeof dist);
while(!que.empty()) que.pop();
vis[src] = true;
que.push(src);
while(!que.empty()){
int u = que.front();
que.pop();
for(int i = head[u]; i ; i = e[i].nxt){
if(e[i].f && !vis[e[i].v]){
que.push(e[i].v);
vis[e[i].v] = 1;
dist[e[i].v] = dist[u]+1;
}
}
}
} int dfs(int u,int delta){
if(u== sink) return delta;
else{
int ret = 0;
for(int i = head[u]; delta&&i; i = e[i].nxt){
if(e[i].f && dist[e[i].v] == dist[u]+1){
int dd = dfs(e[i].v,min(e[i].f,delta));
e[i].f -= dd;
e[i^1].f += dd;
delta -= dd;
ret += dd;
}
}
return ret;
}
} int maxflow(){
int ret = 0;
while(true){
memset(vis,0,sizeof vis);
bfs();
if(!vis[sink]) return ret;
ret += dfs(src,inf);
} }
int main(){ while(~scanf("%d%d",&n,&m)){
src = 0;
sink = n+1;
for(int i = 0; i < 3; i++) vb[i].clear();
for(int i = 1; i <= n; i++) scanf("%d",&city[i]);
bool flag = 0;
while(m--){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(d==0){
vb[1].push_back(build(a,b,c));//现代桥
}
else if(d<0){
vb[0].push_back(build(a,b,c));//隧道
flag = 1;
}else{
vb[2].push_back(build(a,b,c));//古代桥
}
}
if(!flag){
printf("Poor Heaven Empire\n");
continue;
}
int d = vb[2].size();
int maxf = -1,minc = inf;
for(int i = 0; i < (1<<d); i++){
init();
int tc = 0;
for(int j = 0; j < d; j++){
if(i&(1<<j)){
addedge(vb[2][j].u,vb[2][j].v,inf);
tc += vb[2][j].w;
}else{
addedge(vb[2][j].u,vb[2][j].v,1);
}
}
for(int i = 1; i <= n; i++){
addedge(0,i,city[i]);
}
for(int i = 0; i < vb[1].size(); i++){
addedge(vb[1][i].u,vb[1][i].v,inf);
}
for(int i = 0; i < vb[0].size(); i++){
addedge(vb[0][i].u,vb[0][i].v,inf);
addedge(vb[0][i].u,n+1,vb[0][i].w);
}
int tm = maxflow();
if(tm > maxf){
maxf = tm;
minc = tc;
}
if(tm==maxf && minc > tc){
minc = tc;
} }
if(maxf==-1){
printf("Poor Heaven Empire\n");
}else{
printf("%d %d\n",maxf,minc);
}
}
return 0;
}
HDU4309-Seikimatsu Occult Tonneru(最大流)的更多相关文章
- HDU 4309 Seikimatsu Occult Tonneru
Seikimatsu Occult Tonneru Time Limit: 6000ms Memory Limit: 32768KB This problem will be judged on HD ...
- HDU 4309 Seikimatsu Occult Tonneru(最大流+二进制枚举)
http://acm.hdu.edu.cn/showproblem.php?pid=4309 题意: 有n个城市,每个城市有num[i]个居民,有敌人要进行地毯式轰击,居民们要逃到隧道去.现在有隧道, ...
- HDU 4309 Seikimatsu Occult Tonneru 网络流量+像缩进
主题链接:点击打开链接 意甲冠军: 题意:给出一张N(N<=100)个点,M(M<=1000条)边的有向图. 每一个点上都有一些人.每条边有4个属性(u,v,w,p). 这些边分为三种:( ...
- HDU 4309 Seikimatsu Occult Tonneru (状压 + 网络流)
题意:输入 n 个城市 m 条边,但是边有三种有向边 a b c d,第一种是 d 是 0,那么就是一条普通的路,可以通过无穷多人,如果 d < 0,那么就是隧道,这个隧道是可以藏 c 个人, ...
- Seikimatsu Occult Tonneru(网络流,状态数(建不建边)不多时,可考虑直接进行枚举
http://acm.hdu.edu.cn/showproblem.php?pid=4309 总结:边可存东西时,可新建一个点x连接u.v,x再连向汇点: #include<iostream&g ...
- 使用C#处理基于比特流的数据
使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- FILE文件流的中fopen、fread、fseek、fclose的使用
FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
随机推荐
- [置顶] head first 设计模式之----Observer pattern
浅谈设计模式之----观察者模式 观察者模式也是我们日常程序编写中碰到比较多的一种设计模式.首先,所谓观察者模式定义就是指:在对象之间定义了一对多的依赖,这样一来,当一个对象的状态发生变化的 ...
- Android学习-----如何使用sqlite对于后台数据交换,sqlite使用例程入门
SQLite 这是一个非常流行的嵌入式数据库.它支持 SQL 查询,和只使用很少的内存.Android 在集成实施 SQLite,所以每 Android 应用程序能够使用 SQLite 数据库. ...
- 调用一个系统命令,并读取它的输出值(使用QProcess.readAll)
下面我们再看一个更复杂的例子,调用一个系统命令,这里我使用的是 Windows,因此需要调用 dir:如果你是在 Linux 进行编译,就需要改成 ls 了. mainwindow.h #ifndef ...
- 从零开始,使用python快速开发web站点(2)
书接上文.http://blog.csdn.net/i7788/article/details/10306595 首先是数据库的搭建,这里的django的数据模型搭建十分easy. no sql.ju ...
- iOS安全攻击和防御(24):敏感的保护方案逻辑(1)
iOS安全攻击和防御(24):敏感的保护方案逻辑(1) Objective-C代码easy被hook.暴露信息太赤裸裸,为了安全,改用C来写吧! 当然不是所有代码都要C来写,我指的是敏感业务逻辑代码. ...
- 公布一个软件,轻新视频录播程序,H264/AAC录制视音频,保存FLV,支持RTMP直播
已经上传到CSDN,下载地址:http://download.csdn.net/detail/avsuper/7421647,不要钱滴,嘿嘿... 本程序能够把摄像头视频和麦克风音频,录制为FLV文件 ...
- 10招让你成为杰出的Java程序员(转)
如果你是一个热衷于技术的 Java 程序员, 那么下面的 10 个要点可以让你在众多 Java 开发人员中脱颖而出. 1. 拥有扎实的基础和深刻理解 OO 原则 对于 Java 程序员,深刻理解 Ob ...
- 字典实体类:DictionaryEntry类
DictionaryEntry类是一个字典集合,主要包括的内容是键/值对.这样的组合方式能够方便地定位数据,当中的"键"具备唯一性,类似于数据库中的"id",一 ...
- 用JS实现发邮件的功能 完美解决
怎样用JS实现发邮件的功能? 我想用JS实现把页面文本框中的内容直接通过邮件的方式发送到一个指定的邮箱.fengxq给出的答案是<script language=javascript>if ...
- 使用注解实现 bean 转 csv
csv 文件是 aaa,bbb,ccc aaa,bbb,ccc 保存 这里的要求是 List<T> 线性表的类型 转换成 类别似 html 中 table的格式,即第一行是 head 后面 ...