您的位置:首页 > 理论基础 > 计算机网络

HDU 4309 Seikimatsu Occult Tonneru(网络流+枚举状态)

2014-07-11 18:02 302 查看
由于桥最多只有12个,所以可以直接枚举修理那个桥,注意不修理的桥可以通过一个人,而且注意图中的边有方向,对于隧道,只可以其他点到隧道起始点再到隧道,所以可以从起始点向汇点连一条流量为容量的边,而其他边只需要连容量为无穷的边,然后最大流一下。

Online Judge	Online Exercise	Online Teaching	Online Contests	Exercise Author
F.A.Q
Hand In Hand
Online Acmers
Forum | Discuss
Statistical Charts
Problem Archive
Realtime Judge Status
Authors Ranklist

C/C++/Java Exams
ACM Steps
Go to Job
Contest LiveCast
ICPC@China
STD Contests
VIP Contests
Virtual Contests
DIY | Web-DIY beta
Recent Contests
Author 宦成颖
Mail Mail 0(0)
Control Panel Control Panel
Sign Out Sign Out

7月22-8月21多校联合训练期间,会根据实际负载关闭部分模块,若有不便,请谅解~
View Code

Problem : 4309 ( Seikimatsu Occult Tonneru )     Judge Status : Accepted
RunId : 11003913    Language : C++    Author : huanzhizun888
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
#include<iostream>
#include<stdio.h>
#include<memory.h>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAXN 230
#define MAXE 10010
#define INF 1e9
int tmp,source,des,cnt;
int n,m;
int x[MAXN];
struct Edge{
int from, to;
int next,cap;
}edge[MAXE];
struct pi{
int no;
int to;
int cos;
}pp[30];
struct ppi{
int no;
int to;
int val;
int d;
}pp1[1001];
int head[MAXN];
int gap[MAXN],dep[MAXN],cur[MAXN], stack[MAXN], top;
int ISAP()
{
int cur_fLow,max_fLow,u,insert,i;
memset(dep,0,sizeof(dep));
memset(gap,0,sizeof(gap));
memcpy(cur, head, n);
max_fLow = 0;
u = source;
top = 0;
while(dep[source] < n)
{
if(u == des)
{
cur_fLow = INF;
for(i = 0; i < top; ++i)
{
if(cur_fLow > edge[stack[i]].cap)
{
insert = i;
cur_fLow = edge[stack[i]].cap;
}
}
for(i = 0; i < top; ++i)
{
edge[stack[i]].cap -= cur_fLow;
edge[stack[i]^1].cap += cur_fLow;
}
max_fLow += cur_fLow;
u = edge[ stack[top = insert]].from;
}
for(i = cur[u]; i != -1; i = edge[i].next)
if((edge[i].cap > 0) && (dep[u] == dep[edge[i].to]+1))
break;
if(i != -1)
{
stack[top++] = i;
u = edge[i].to;
}
else
{
if(0 == --gap[dep[u]]) break;
int minn = n;
for(i = head[u]; i != -1; i = edge[i].next)
{
if(edge[i].cap > 0)
minn = (minn > dep[edge[i].to]) ? (cur[u]= i, dep[edge[i].to]) : minn;
}
++gap[dep[u] = minn + 1];
if(u != source) u = edge[stack[--top]].from;
}
}
return max_fLow;
}
void add(int u,int v,int f)
{
edge[cnt].next = head[u];
edge[cnt].from = u;
edge[cnt].to = v;
edge[cnt].cap = f;
head[u] = cnt++;
edge[cnt].next = head[v];
edge[cnt].from = v;
edge[cnt].to = u;
edge[cnt].cap = 0;
head[v] = cnt++;
}
int main()
{
int i,j,p,k,tot,a,b,c,d,cal;
while(scanf("%d%d",&n,&m)!=EOF){
tot=0;
cnt=0;
cal=0;
for(i=1;i<=n;i++){
scanf("%d",&p);
x[i]=p;
}
for(i=0;i<m;i++){
scanf("%d%d%d%d",&a,&b,&c,&d);
if(d>0){
pp[tot].no=a;
pp[tot].to=b;
pp[tot].cos=c;
tot++;
}
else{
pp1[cal].no=a;
pp1[cal].to=b;
pp1[cal].val=c;
pp1[cal++].d=d;
}
}
k=1<<tot;
a=0;
b=INF;
for(i=0;i<k;i++){
cnt=0;
memset(head,-1,sizeof(head));
for(j=1;j<=n;j++){
add(0,j,x[j]);
}
for(j=0;j<cal;j++){
if(pp1[j].d<0){
add(pp1[j].no,pp1[j].to,INF);
add(pp1[j].no,n+1,pp1[j].val);
}
else{
add(pp1[j].no,pp1[j].to,INF);
}
}
c=0;
for(j=0;j<tot;j++){
if(i&(1<<j)){
add(pp[j].no,pp[j].to,INF);
c+=pp[j].cos;
}
else{
add(pp[j].no,pp[j].to,1);
}
}
source=0;
des=n+1;
d=ISAP();
if(d>a){
a=d;
b=c;
}
else if(d==a&&b>c){
b=c;
}
}
if(a==0){
printf("Poor Heaven Empire\n");
}
else{
printf("%d %d\n",a,b);
}
}
return 0;
}
[ Copy to Clipboard ]    [ Save to File]

Home | Top	 Hangzhou Dianzi University Online Judge 3.0
Copyright © 2005-2014 HDU ACM Team. All Rights Reserved.
Designer & Developer : Wang Rongtao LinLe GaoJie GanLu
Total 0.001500(s) query 1, Server time : 2014-07-11 18:04:50, Gzip enabled	Administration
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: