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使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
随机推荐
- C++中的函数模板
我们在定义函数时,可以通过定义函数模板,来简化一些功能相同而数据类型不同的函数的定义和调用过程. C++中的函数模板 对于类的声明来说,也有同样的问题.有时,有两个或多个类,其功能是相同的,仅仅是数据 ...
- 【源代码】基于Android和蓝牙的单片机温度採集系统
如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 STC89C52单片机通过HC-06蓝牙模块与Android手机通信实例- 基于And ...
- ASP.NET 常用内置对象详解-----Response
利用提供的内置对象,可以实现页面之间的数据传递及实现一些特定的功能,如:缓冲输出,页面重定向等等. Response :响应,反应 Request:请求 Server:服务器 Application: ...
- callback用法简介
源地址:https://argcv.com/articles/2669.c callback,函数的回调,从ANSI C开始,一直被广为使用.无论是windows API的所谓消息机制,动态链接库的调 ...
- Facial Landmark Detection
源地址:http://www.learnopencv.com/facial-landmark-detection/#comment-2471797375 OCTOBER 18, 2015 BY SAT ...
- [Windows Phone]AnimationHelper管理分散的Storyboard
问题描述: 在Windows Phone开发时候,可能存在这样的问题: 某一个控件需要一个特定的展现(这里假定是一个特定动画),那么我们会这么解决这个问题呢? 打开Blend,根据需求需求给控件添加动 ...
- 解决AngularJS和Django模板标签冲突问题
原地址 Django和AngularJS在模板中使用同样的符号来引用变量,例如 {{variable_name}}. 有两种解决办法,各有利弊.一个修改AngularJS模板语法,另一个使用Djang ...
- Twenty Newsgroups Classification任务之二seq2sparse(5)
接上篇blog,继续分析.接下来要调用代码如下: // Should document frequency features be processed if (shouldPrune || proce ...
- Enum的简单了解
Enum可以将一组具名的有限集合创建成一种新的类型,而这些具名的值可以作为常规的程序组件使用. 在创建enum时,编译器会为你生成一个相关的类,这个类继承自java.lang.Enum,所以enum本 ...
- poj-3791-An Easy Game-记忆化搜索
dp[i][j]:还有i个不同样的位置,还能走j步,一共同拥有多少种走法. 非常明显 dp[i][j]=sigm(dp[i-k][j-1]*c[i][k]*c[n-i][m-k]); 用记忆化搜索记忆 ...