JZOJ.5331【NOIP2017模拟8.23】壕游戏
Description
Input
Output
Sample Input
6 8 2 2
4 5
1 2 4 0 2
1 3 5 0 2
3 4 1 5 1
2 5 1 0 1
4 6 4 2 2
5 6 0 4 2
1 5 5 9 2
2 6 4 5 2
Sample Output
16
Data Constraint
Hint
类似于一种可撤销的贪心,不难想到这是费用流的模型。
考虑到我们实际会用到的边比实际的边少很多,我们可以动态建边,以减少空间的使用,即当流过了一条边之后再建立第二次流过需要的边(如果有第二次的话)。
然后建立超级源点和超级汇点,跑个费用流就可以了..
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define M 4000105
#define N 1005
using namespace std;
bool visit[N];
int head[N],pre[N],num,n,m,k,s,dis[N],team[M*],l,r,ans;
struct data{
int next,to,flow,power,st,a,c,er;
}line[M];
void add(int u,int v,int x,int y,int z,int w){
num++;
line[num].st=u;
line[num].to=v;
line[num].next=head[u];
line[num].flow=w;
line[num].power=x+y;
line[num].a=x;
line[num].c=z;
line[num].er=num+;
head[u]=num;
num++;
line[num].st=v;
line[num].to=u;
line[num].next=head[v];
line[num].flow=;
line[num].power=-x-y;
line[num].a=x;
line[num].c=z;
line[num].er=num-;
head[v]=num;
}
void SPFA(){
int u=;
l=,r=;
team[]=;
visit[]=true;
dis[]=;
while (l<r){
u=team[++l];
for (int v=,i=head[u];i;i=line[i].next){
v=line[i].to;
if ((dis[v]>dis[u]+line[i].power)&&(line[i].flow)){
dis[v]=dis[u]+line[i].power;
pre[v]=i;
if (visit[v]==false){
team[++r]=v;
visit[v]=true;
}
}
visit[u]=false;
}
}
if (pre[n+]==-) ans=-;
}
void solve(){
ans+=dis[n+];
int i=pre[line[pre[n+]].st];
do{
line[i].flow--;
line[line[i].er].flow++;
line[i].c--;
if (line[i].c>)
add(line[i].st,line[i].to,line[i].a,line[i].power,line[i].c,);
line[i].c=;
line[line[i].er].c=;
i=pre[line[i].st];
}while (line[i].to!=);
}
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&k,&s);
num=;
add(,,,,,);
for (int u,i=;i<=s;++i){
scanf("%d",&u);
add(u,n+,,,,);
}
for (int i=,u,v,x,y,z;i<=m;i++){
scanf("%d%d%d%d%d",&u,&v,&x,&y,&z);
add(u,v,x,y,z,);
}
ans=;
while (k--){
for (int i=;i<=n+;++i)
dis[i]=,visit[i]=false;
pre[n+]=-;
SPFA();
if (ans==-) break;
solve();
}
printf("%d\n",ans);
return ;
}
神奇的代码
改了一个晚上终于发现原来一条边流完后建立另一条边时原来边的C值(可流过次数)要清零QAQ)
当时考试的时候看出来是网络流不想写随便写了个SPFA水了水...
JZOJ.5331【NOIP2017模拟8.23】壕游戏的更多相关文章
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数
4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms Memory Limits: 262144 KB Detailed ...
- JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)
5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ...
- JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列
5235. [NOIP2017模拟8.7A组]好的排列 (File IO): input:permutation.in output:permutation.out Time Limits: 1000 ...
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...
- JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计
5230. [NOIP2017模拟A组模拟8.5]队伍统计 (File IO): input:count.in output:count.out Time Limits: 1500 ms Memory ...
- Python之模拟职场人生游戏
题目:模拟人生 要求:1.至少有两个角色 2.玩的过程中,有冲突 3.根据不同的交互,产生不同的行为. 4.一定要用到面向对象语法和思想 1.解题思路 创建一个类,赋予角色不同的方法,使用面向对象思想 ...
- 常用Java API之Ramdom--用代码模拟猜数小游戏
常用Java API之Ramdom Ramdom类用来生成随机数字.使用起来也是三个步骤: 1.导包 import java.util.Random; 2.创建 Random r = new Rand ...
随机推荐
- LINQ操作符三:限制操作符
where是限制操作符,它将过滤标准应用在序列上,按照提供的逻辑对序列中的数据进行过滤. where操作符不启动查询的执行.当开始对序列进行遍历时才开始执行,此时过滤条件将被应用到查询中. 示例: / ...
- 高性能高并发网络库:StateThreads
StateThreads是一个C的网络程序开发库,提供了编写高性能.高并发.高可读性的网络程序的开发库,轻量级网络应用框架 共也就3000行C代码 网络程序(Internet Application) ...
- mysql数据库对时间进行默认的设置
//----------------------------------------------------------sql语句----------------------------------- ...
- C++ 类的隐式转换
所谓类的隐式转换,就是将实参类型转成形参类型--如果不一致的话. 这个转换与基本类型转换不太一样,具体则是在形参类型的构造函数中使用实参类型的数据,从而构造出一个临时对象. 下面的代码,类Person ...
- try except 异常处理
1.捕获指定异常 2.捕获所有异常
- (转)ALSA配置文件(alsa.conf, asoundrc, asound.conf)及其自动加载 And HDMI Adiuo
原文出处:http://blog.sina.com.cn/s/blog_a04184c101010kry.html 警告:错误的EDID会造成HDMI发声异常 #title:box:HDMI Audi ...
- [CS]C#操作word
近期在做的项目已经改了好几版,近期这一版用到了word,当然不是直接使用word,而是使用第三方的ActiveX控件:dsoframer.ocx.此控件的使用和其它控件的使用流程没有不论什么差别.接下 ...
- asp.net管线
- c++ _int64 转成string
_i64toa(a,buffer,10); scanf("%I64d",&a);printf("%I64d",a); 就可以正确输入输出了.当使用uns ...
- React封装RadioGroup
class RadioGroup extends React.Component { getRadioComponent(item, index) { return <div className ...