最大流建图。开始以为旧桥有1000座,没敢用枚举,后来看看题目发现了只是十二座。枚举桥的状态没问题。

对于隧道的容量W,可以虚拟出第三个结点表示,如u->v。增加一个点p,u->p(INF),p->v(INF),p->End(W);

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std; const int INF=0x3f3f3f3f;
const int MAXN=300;//点数的最大值
const int MAXM=5000;//边数的最大值 struct Node{
int from,to,next;
int cap;
}edge[MAXM]; struct Edge{
int u,v,w;
}Tun[30],Acient[20],Modern[1000]; int tol;
int dep[MAXN];
int head[MAXN];
int val[MAXN]; void init(){
tol=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w){
edge[tol].from=u;
edge[tol].to=v; edge[tol].cap=w; edge[tol].next=head[u];
head[u]=tol++;
edge[tol].from=v;
edge[tol].to=u;
edge[tol].cap=0;
edge[tol].next=head[v];
head[v]=tol++;
} int BFS(int start,int end){
int que[MAXN];
int front,rear; front=rear=0;
memset(dep,-1,sizeof(dep));
que[rear++]=start;
dep[start]=0;
while(front!=rear){
int u=que[front++];
if(front==MAXN)front=0;
for(int i= head[u];i!=-1; i=edge[i].next){
int v=edge[i].to;
if(edge[i].cap>0&& dep[v]==-1){
dep[v]=dep[u]+1;
que[rear++]=v;
if(rear>=MAXN) rear=0;
if(v==end)return 1;
}
}
}
return 0;
} int dinic(int start,int end){
int res=0;
int top;
int stack[MAXN];
int cur[MAXN];
while(BFS(start,end)){
memcpy(cur,head, sizeof(head));
int u=start;
top=0;
while(1){
if(u==end){
int min=INF;
int loc;
for(int i=0;i<top;i++)
if(min>edge [stack[i]].cap){
min=edge [stack[i]].cap;
loc=i;
}
for(int i=0;i<top;i++){
edge[stack[i]].cap-=min;
edge[stack[i]^1].cap+=min;
}
res+=min;
top=loc;
u=edge[stack[top]].from;
}
for(int i=cur[u]; i!=-1; cur[u]=i=edge[i].next)
if(edge[i].cap!=0 && dep[u]+1==dep[edge[i].to])
break;
if(cur[u] !=-1){
stack [top++]= cur[u];
u=edge[cur[u]].to;
}
else{
if(top==0) break;
dep[u]=-1;
u= edge[stack [--top] ].from;
}
}
}
return res;
} int main(){
int n,e;
int nT,nA,nM;
int u,v,w,p;
while(scanf("%d%d",&n,&e)!=EOF){
nT=nA=nM=0;
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
for(int i=0;i<e;i++){
scanf("%d%d%d%d",&u,&v,&w,&p);
if(p==0){
Modern[nM].u=u;Modern[nM].v=v;
Modern[nM].w=w;
nM++;
}
else if(p<0){
Tun[nT].u=u;Tun[nT].v=v;
Tun[nT].w=w;
nT++;
}
else{
Acient[nA].u=u; Acient[nA].v=v;
Acient[nA].w=w;
nA++;
}
}
int Start=0,End;
End=n+nT+1;
int len=(1<<nA);
int cost,people,ansc=0,anspeople=0;
for(int i=0;i<len;i++){
init();
cost=0;
for(int k=1;k<=n;k++){
addedge(Start,k,val[k]);
}
for(int k=0;k<nA;k++){
if(i&(1<<k)){
addedge(Acient[k].u,Acient[k].v,INF);
cost+=Acient[k].w;
}
else
addedge(Acient[k].u,Acient[k].v,1);
}
for(int k=0;k<nM;k++){
addedge(Modern[k].u,Modern[k].v,INF);
}
for(int k=0;k<nT;k++){
addedge(Tun[k].u,n+k+1,INF);
addedge(n+k+1,Tun[k].v,INF);
addedge(n+k+1,End,Tun[k].w);
}
// system("pause");
people=dinic(Start,End);
if(people>anspeople){
anspeople=people;
ansc=cost;
}
else if(people==anspeople){
ansc=min(cost,ansc);
}
}
if(anspeople==0){
printf("Poor Heaven Empire\n");
}
else
printf("%d %d\n",anspeople,ansc);
}
return 0;
}

  

HDU 4309 Contest 1的更多相关文章

  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 5045 Contest(状压DP)

    Problem Description In the ACM International Collegiate Programming Contest, each team consist of th ...

  4. hdu - 5045 - Contest(国家压缩dp)

    意甲冠军:N个人M通过主打歌有自己的期望,每个问题发送人玩.它不能超过随机播放的次数1,追求最大业绩预期 (1 ≤ N ≤ 10,1 ≤ M ≤ 1000). 主题链接:pid=5045" ...

  5. [ACM] hdu 5045 Contest (减少国家Dp)

    Contest Problem Description In the ACM International Collegiate Programming Contest, each team consi ...

  6. HDU–5988-Coding Contest(最小费用最大流变形)

    Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

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

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

  8. hdu 5045 Contest(状态压缩DP)

    题解:我们使用一个二位数组dp[i][j]记录进行到第i个任务时,人组合为j时的最大和(这里的j我们用二进制的每位相应一个人). 详细见代码: #include <iostream> #i ...

  9. HDU 5045 Contest

    pid=5045">主题链接~~> 做题感悟:比赛时这题后来才写的,有点小尴尬.两个人商议着写写了非常久才写出来,I want to Powerful ,I believe me ...

随机推荐

  1. codevs——T1048 石子归并

     http://codevs.cn/problem/1048/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Descriptio ...

  2. js+ canvas 实现人物走动

    在网上看了一篇管道工玛利亚走动的图片,感觉人物走动的太生涩了,就写了一下代码改动一下: js 代码: //定义数组图片集合 var marios = new Array("image/QQ截 ...

  3. Android Camera解析(上) 调用系统相机拍摄照片

    开发中我们常须要通过相机获取照片(拍照上传等).一般通过调用系统提供的相机应用就可以满足需求:有一些复杂需求还须要我们自己定义相机相关属性,下篇我们会涉及到. 首先我们来研究怎样简单调用系统相机应用来 ...

  4. 文件重命名之动态改动ListView里指定Item中的组件属性

    在Android实际开发过程中常常会遇到,改动ListView中某一项的值.怎样达到这一目的呢? 方法主要有两种: 第一种方式:当ListView中某一项的值发生变化之后,又一次载入数据已达到更新Li ...

  5. lvs 负载均衡环境搭建

    记录一下搭建lvs环境的步骤 当中master 10.0.0.11,backup 10.0.0.15.realserver1 10.0.0.119.realserver210.0.0.11 1.mkd ...

  6. php后期静态绑定

    php后期静态绑定 自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类. 虽然也可以调用非静态方法,但是不会在运行时绑定. static 不再只是简 ...

  7. Ubuntu 16.04 安装 Wireshark分析tcpdump的pcap包——sudo apt install wireshark-qt

    tcpdump 的抓包保存到文件的命令参数是-w xxx.cap   抓eth1的包  tcpdump -i eth1 -w /tmp/xxx.cap    抓 192.168.1.123的包  tc ...

  8. webservice为什么不能用List参数,而只能用数组代替,我想是否因为List没有具体的类型信息,但用泛型的List(如:List<customer>)为什么也不行。如果用作参数的类中含有List<T>字段该如何处理?webservice参数是否支持

    转自:https://social.microsoft.com/Forums/zh-CN/aded4301-b5f1-4aa6-aa46-16c46a60d05e/webservice20026201 ...

  9. android 打包工具

    sdk.jar-修改路径-JarToDex-DexToSmali-复制文件

  10. 七牛上图片总是net::ERR_NAME_NOT_RESOLVED

    七牛上图片总是net::ERR_NAME_NOT_RESOLVED >> php这个答案描述的挺清楚的:http://www.goodpm.net/postreply/php/101000 ...