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

Problem Description
During the world war, to avoid the upcoming Carpet-bombing from The Third Reich, people in Heaven Empire went to Great Tunnels for sheltering.

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.
 
Input
Multiple Cases.

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.
 
Output
If nobody can hide in the Tunnels, print “Poor Heaven Empire”, else print two integers: maximum number and minimum cost.
 
Sample Input
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
 
Sample Output
4 0
4 3
 
Author
BUPT
 
题意:n座城市,每一个城市有ni个人,m条边, 三种建筑,分别为隧道。古桥,现代桥,隧道能够容纳一定数量的人,能够通过无数次。现代桥能够通过无数次,古桥假设不修善仅仅能通过一次,修缮后能够通过无数次,修缮须要一定的费用,且古桥的最大数量为12,如今每一个城市的人须要到隧道避难,问最多能避难的人数,以及最多人数的最小花费(古桥的修缮)。
思路:最大流。构造超级源点和汇点,每一个城市与源点连边流量为人数,现代桥能够通过无数次。连边,流量为无限。隧道能够通过无数次,连边流量为无限,与汇点连边。流量为能够容纳的人数。然后枚举古桥2^12修与不修的情况,做这么多遍最大流就可以。

#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(最大流)的更多相关文章

  1. HDU 4309 Seikimatsu Occult Tonneru

    Seikimatsu Occult Tonneru Time Limit: 6000ms Memory Limit: 32768KB This problem will be judged on HD ...

  2. HDU 4309 Seikimatsu Occult Tonneru(最大流+二进制枚举)

    http://acm.hdu.edu.cn/showproblem.php?pid=4309 题意: 有n个城市,每个城市有num[i]个居民,有敌人要进行地毯式轰击,居民们要逃到隧道去.现在有隧道, ...

  3. HDU 4309 Seikimatsu Occult Tonneru 网络流量+像缩进

    主题链接:点击打开链接 意甲冠军: 题意:给出一张N(N<=100)个点,M(M<=1000条)边的有向图. 每一个点上都有一些人.每条边有4个属性(u,v,w,p). 这些边分为三种:( ...

  4. HDU 4309 Seikimatsu Occult Tonneru (状压 + 网络流)

    题意:输入 n 个城市 m 条边,但是边有三种有向边 a b  c d,第一种是 d 是 0,那么就是一条普通的路,可以通过无穷多人,如果 d < 0,那么就是隧道,这个隧道是可以藏 c 个人, ...

  5. Seikimatsu Occult Tonneru(网络流,状态数(建不建边)不多时,可考虑直接进行枚举

    http://acm.hdu.edu.cn/showproblem.php?pid=4309 总结:边可存东西时,可新建一个点x连接u.v,x再连向汇点: #include<iostream&g ...

  6. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

  7. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  8. FILE文件流的中fopen、fread、fseek、fclose的使用

    FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...

  9. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

随机推荐

  1. [读书笔记]黑客与画家[Hackers.and.Painters]

    (书生注:这本书写的不错.针对程序员,可以带来不同角度的想法,有助于反思自己的程序员工作.我甚至从中发现了自己爱用铅笔的原因...  尤其是其中关于黑客的定义,包括黑客认为的乐趣和目的,让人更深层次思 ...

  2. Linux入门基础#2:Linux文件系统基本结构

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  3. Cocos2d-x CCProgressTimer

    CCProgressTimer,创建使用这个节点可以大致实现两个作用的效果: 其一:在游戏中几乎大部分的游戏启动界面都是游戏加载画面,那么用到的一般是进度条提示加载进度,其使用的就是CCProgres ...

  4. Dom4j和Xpath(转)

    1.DOM4J简介 DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和JAXP. DOM4J使 ...

  5. SQL中如何将一个表中的某一列的数据复制到另一个表中的某一列里

    表一: SPRD PRD_NO      SPC 001                NULL 002               NULL 003               NULL ...   ...

  6. 模式识别 - 处理多个演示样本研究(MIL)特点(matlab)

    处理多个演示样本研究(MIL)特点(matlab) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27206325 多演示样例学习 ...

  7. [置顶] iframe使用总结(实战)

    说在前面的话,iframe是可以做很多事情的. 例如: a>通过iframe实现跨域; b>使用iframe解决IE6下select遮挡不住的问题 c>通过iframe解决Ajax的 ...

  8. js快速分享代码

    这是一款简单易用的文章分享工具,您只需将下面的html代码拷贝到模板中就可以实现文章快速分享功能.如果您想分享你的博客.个人网站或者企业网站等等,下面是两款不错的分享工具,值得拥有! 1. <d ...

  9. python手记(46)

    #!/usr/bin/env python   # -*- coding: utf-8 -*- #http://blog.csdn.net/myhaspl   #code:myhaspl@qq.com ...

  10. Linux Shell脚本入门--grep命令详解

    grep简介<摘自鸟哥,并加以整理.> grep (global search regular expression(RE) and print out the line,全面搜索正则表达 ...