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

类似于一种可撤销的贪心,不难想到这是费用流的模型。

考虑到我们实际会用到的边比实际的边少很多,我们可以动态建边,以减少空间的使用,即当流过了一条边之后再建立第二次流过需要的边(如果有第二次的话)。

然后建立超级源点和超级汇点,跑个费用流就可以了..

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define M 4000105
 6 #define N 1005
 7 using namespace std;
 8 bool visit[N];
 9 int head[N],pre[N],num,n,m,k,s,dis[N],team[M*2],l,r,ans;
10 struct data{
11     int next,to,flow,power,st,a,c,er;
12 }line[M];
13 void add(int u,int v,int x,int y,int z,int w){
14     num++;
15     line[num].st=u;
16     line[num].to=v;
17     line[num].next=head[u];
18     line[num].flow=w;
19     line[num].power=x+y;
20     line[num].a=x;
21     line[num].c=z;
22     line[num].er=num+1;
23     head[u]=num;
24     num++;
25     line[num].st=v;
26     line[num].to=u;
27     line[num].next=head[v];
28     line[num].flow=0;
29     line[num].power=-x-y;
30     line[num].a=x;
31     line[num].c=z;
32     line[num].er=num-1;
33     head[v]=num;
34 }
35 void SPFA(){
36     int u=0;
37     l=0,r=1;
38     team[1]=0;
39     visit[0]=true;
40     dis[0]=0;
41     while (l<r){
42         u=team[++l];
43         for (int v=0,i=head[u];i;i=line[i].next){
44             v=line[i].to;
45             if ((dis[v]>dis[u]+line[i].power)&&(line[i].flow)){
46                 dis[v]=dis[u]+line[i].power;
47                 pre[v]=i;
48                 if (visit[v]==false){
49                 team[++r]=v;
50                 visit[v]=true;
51                 }
52             }
53             visit[u]=false;
54         }
55     }
56     if (pre[n+1]==-1) ans=-1;
57 }
58 void solve(){
59     ans+=dis[n+1];
60     int i=pre[line[pre[n+1]].st];
61     do{
62         line[i].flow--;
63         line[line[i].er].flow++;
64         line[i].c--;
65         if (line[i].c>0)
66             add(line[i].st,line[i].to,line[i].a,line[i].power,line[i].c,1);
67         line[i].c=0;
68         line[line[i].er].c=0;
69         i=pre[line[i].st];
70         }while (line[i].to!=1);
71 }
72 int main(){
73     freopen("game.in","r",stdin);
74     freopen("game.out","w",stdout);
75     scanf("%d%d%d%d",&n,&m,&k,&s);
76     num=0;
77     add(0,1,0,0,99999999,99999999);
78     for (int u,i=1;i<=s;++i){
79         scanf("%d",&u);
80         add(u,n+1,0,0,99999999,99999999);
81     }
82     for (int i=1,u,v,x,y,z;i<=m;i++){
83         scanf("%d%d%d%d%d",&u,&v,&x,&y,&z);
84         add(u,v,x,y,z,1);
85     }
86     ans=0;
87     while (k--){
88         for (int i=0;i<=n+1;++i)
89             dis[i]=99999999,visit[i]=false;
90         pre[n+1]=-1;
91         SPFA();
92         if (ans==-1) break;
93         solve();
94     }
95     printf("%d\n",ans);
96     return 0;
97 }

神奇的代码

改了一个晚上终于发现原来一条边流完后建立另一条边时原来边的C值(可流过次数)要清零QAQ)

当时考试的时候看出来是网络流不想写随便写了个SPFA水了水...

转载于:https://www.cnblogs.com/Lanly/p/7420597.html

JZOJ.5331【NOIP2017模拟8.23】壕游戏相关推荐

  1. 我是大富豪php源码,最全大富豪3.4源码【自用可运营】含23款子游戏+可控制输赢工具...

    最全大富豪3.4源码[自用可运营]含23款子游戏,可用的口袋支付,全套工具 大富豪问题比较多,不是说论坛上的大富豪不能用,只是东西比较散,需要自己拼起来,现在我为大家整理和修复好一套可用的! 可能还会 ...

  2. Java黑皮书课后题第8章:*8.23(游戏:找到翻转的单元格)假定给定一个填满0和1的6*6矩阵,所有的行和列都有偶数个1。让用户翻转一个单元,编写一个程序找到哪个单元格被翻转了

    *8.23(游戏:找到翻转的单元格)假定给定一个填满0和1的6*6矩阵,所有的行和列都有偶数个1.让用户翻转一个单元,编写一个程序找到哪个单元格被翻转了 题目 题目描述与运行示例 破题 代码 题目 题 ...

  3. Java黑皮书课后题第7章:**7.23(游戏:储物柜难题)一个学校有100个储物柜和100个学生。所有的储物柜在上学的第一天都是关着的。…在所有学生都经过教学楼并且改变柜子之后,哪些柜子是开着的?

    7.23(游戏:储物柜难题)一个学校有100个储物柜和100个学生.所有的储物柜在上学的第一天都是关着的.-在所有学生都经过教学楼并且改变柜子之后,哪些柜子是开着的? 题目 题目描述 破题 代码 运行 ...

  4. python编程手机模拟点击_python模拟点击玩游戏的实例讲解

    小编发现很多小伙伴都喜欢玩一些游戏,而手游因为玩的场景限制不多,所以受众的人更多.游戏里有很多重复的任务需要我们完成,虽然过程非常无聊,但是为了任务奖励还是有很多小伙伴不厌其烦的去做.那么,有没有什么 ...

  5. Pyhton之模拟石头剪子布游戏篇

    石头剪子布游戏规则:石头>剪子来,剪子>布,布>石头.如果双方出示了一样的手势,就是平局. # coding :UTF_8 # 开发团队 :心心相印 # 开发人员 :机器人小白 # ...

  6. 实验内容:编写程序,模拟抓狐狸小游戏。假设一共有一排5个洞口,小狐狸最开始的时候在其中一个洞口,然后玩家随机打开一个洞口,如果里面有狐狸就抓到了。如果洞口里没有狐狸就第二天再来抓,但是第二天狐狸会在

    '''编写程序,模拟抓狐狸小游戏.假设一共有一排5个洞口,小狐狸最开始的时候在其中一个洞口, 然后玩家随机打开一个洞口,如果里面有狐狸就抓到了.如果洞口里没有狐狸就第二天再来抓, 但是第二天狐狸会在玩 ...

  7. 模拟蒙蒂霍尔悖论游戏

    实验报告 模拟蒙蒂霍尔悖论游戏 实验目的 (1)了解蒙蒂很尔悖论的内容和游戏规则. (2)熟练运用字典方法和集合运算. (3)熟练运用异常处理结构,防止用户非法输人. (4)了解断言语句assert的 ...

  8. python3模拟抓狐狸小游戏

    编写程序,模拟抓狐狸小游戏.假设一共有一排5个洞口,小狐狸最开始的时候在其中一个洞口,然后玩家随机打开一个洞口,如果里面有狐狸就抓到了.如果洞口里没有狐狸就第二天再来抓,但是第二天狐狸会在玩家来抓之前 ...

  9. 用python写一个简单的网页游戏_python模拟点击玩游戏的实例讲解

    小编发现很多小伙伴都喜欢玩一些游戏,而手游因为玩的场景限制不多,所以受众的人更多.游戏里有很多重复的任务需要我们完成,虽然过程非常无聊,但是为了任务奖励还是有很多小伙伴不厌其烦的去做.那么,有没有什么 ...

最新文章

  1. Ubuntu磁盘空间如何扩容
  2. Win XP远程桌面双管理员同时登录
  3. Bottle源码阅读(3) HeaderDict
  4. 1349. 修理牛棚【难度: 中 / 思维 贪心】
  5. 通配符 不是jpg 结尾文件_Struts(十九)- 使用使用通配符匹配
  6. Apache Flink在 bilibili 的多元化探索与实践
  7. 梯度与梯度下降法详解
  8. linux读取.data文件,[20121227]v$datafile访问是从数据文件获取信息吗.txt
  9. 如何截获打印机文件_打印、复印还不会,如何在办公室里混?全程详细教学
  10. react.lazy 路由懒加载_Vue面试题: 如何实现路由懒加载?
  11. 推荐两款工具给爱做实验的人
  12. Delphi – 我的代码之简单五子棋
  13. 不是技术牛人,如何拿到国内IT巨头的Offer(转载)
  14. atitit.系统托盘图标的设计java swing c# .net c++ js
  15. FFmpeg安装及将rtsp流转hls协议流通过nginx进行视频直播
  16. 【无标题】二进制STL文件解析 计算面积和体积与根据高度计算部分体积
  17. 支付宝信用贷豪掷38亿抢客,微粒贷不怂
  18. 人工智能专业计算机毕业设计选题推荐
  19. 据为己有!这位985博导把审稿的文章拒了,自己投!
  20. java实现创蓝短信

热门文章

  1. java学生喂养宠物
  2. cmd下提示“不是内部或外部命令,也不是可运行的程序或批处理文件
  3. 关于如何使用打码平台识别验证码
  4. linux bios密码设置时间,linux忘记root密码及时间设定
  5. 我的世界怎么在服务器中显示键位,我的世界神奇宝贝mod怎么玩 基本键位介绍...
  6. WAP(手机网站)基础知识
  7. 求学贵在主动、坚持——兼谈学生行为礼仪
  8. WLAN驱动分析文档_gzc126_新浪博客
  9. Android 卸载监听详解
  10. Redis入门【安装,常用类型,常用命令行命令】