题意:

给出一个有向无环图(DAG),我们规定有一些边是必须走的,当走到一个出度是0的点时,我们可以瞬移到任何一个我们想去的点,自选起点,走遍所有的必须走的边,使得瞬移次数最少。

思路:

这类题完全没做过啊,赛后问了过了这道题的同学,才知道这么个东西,具体怎么建图模板里都告诉了,红书上就有。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<queue>
#include<stack>
#include<set>
#include<string>
#include<vector>using namespace std;
const int maxn = 510, maxm = maxn * maxn;
const int inf = 1000000000;class MaxFlow//一个挺快的模板,比一般的MaxFlow快,我也不知道为什么。。。
{
private:int next[maxm*2];int num[maxm*2];int a[maxn*2];int row_sum[maxn];int col_sum[maxn];int n , m, K;int d[maxn*2], st[maxn*2], cod[maxn][maxn];int h[maxn*2], vh[maxn*2];bool don[maxm*2],in[maxn*2];int dfs(int, int);bool visit(int, int);
public:int T;int r[maxm*2];MaxFlow() {}int Addedge(int, int, int);int Run();bool FindCircle();void Init(int m){memset(a, 0, sizeof(a));tt = 1;T = m;}int tt;~MaxFlow() {}
} mf;int MaxFlow::Addedge(int x,int y,int rr)
{next[++tt]=a[x];num[tt]=y;r[tt]=rr;a[x]=tt;next[++tt]=a[y];num[tt]=x;r[tt]=0;a[y]=tt;return tt;
}int MaxFlow::dfs(int x,int y)
{if (x==T) return y;int sig=st[x],minh=T+1;do{if (r[st[x]]){if (h[num[st[x]]]+1==h[x]){int k=dfs(num[st[x]],min(y,r[st[x]]));if (k){r[st[x]]-=k;r[st[x]^1]+=k;return k;}}minh=min(minh,h[num[st[x]]]+1);if (h[0]>T) return 0;}st[x]=next[st[x]];if (st[x]==0) st[x]=a[x];}while (sig!=st[x]);if (vh[h[x]]--==0) h[0]=T+1;vh[h[x]=minh]++;return 0;
}int MaxFlow::Run()
{for (int i=0; i<=T; i++) h[i]=vh[i]=0;for (int i=0; i<=T; i++) st[i]=a[i];vh[0]=T+1;int ret=0;while (h[0]<=T) ret+=dfs(0,K+1);return ret;
}bool MaxFlow::visit(int x,int ed)
{if (don[ed])return in[x];don[ed]=true;in[x]=true;for (int p=a[x]; p; p=next[p]){if (r[p] && (ed^p)!=1)if (visit(num[p],p)) return true;}in[x]=false;return false;
}bool MaxFlow::FindCircle()
{for (int i=0; i<=T; i++) in[i]=false;for (int i=1; i<=tt; i++) don[i]=false;for (int i=2; i<=tt; i++){if (r[i] && !don[i]){in[num[i^1]]=true;if (visit(num[i],i)) return true;in[num[i^1]]=false;}}return false;
}int cnt[maxn]; //节点的度int main()
{int t;scanf("%d",&t);int cas=1;while(t--){int n, m;scanf("%d%d", &n, &m);int ss = 0, tt = n+3;//源点和汇点int s = n + 2, t = n+1;//附加源点和附加汇点mf.Init(tt);//注意模板的坑,此模板的源点一定是0,不能自己设定,汇点就是ttfor (int i = 1; i <= n; i++){mf.Addedge(s, i, inf);mf.Addedge(i, t, inf);}memset(cnt, 0, sizeof cnt);int sum = 0;while (m--){int u, v, w;scanf("%d%d%d", &u, &v, &w);if (w){sum++;cnt[u]--;cnt[v]++;}mf.Addedge(u, v, inf);}for (int i = 1; i <= n; i++){if (cnt[i] < 0)mf.Addedge(i, tt, -cnt[i]);elsemf.Addedge(ss, i, cnt[i]);}mf.Run();int fuck = mf.Addedge(t, s, sum);mf.Run();printf("Case #%d: %d\n", cas++, sum - mf.r[fuck^1]);//为什么异或1,因为这个模板的返回值返回的是反向边的流量,所以^1了才是正向边的流量}return 0;
}

hust1342(流量有上下界的最小流)相关推荐

  1. SGU-176 Flow construction 有上下界的最小流

    这里参看了大牛的解题思路,学习了很多.原来上下界流的求法是这么的灵活,尤其我是用的临界表存储的边,删除更新很不方便. http://www.shuizilong.com/house/archives/ ...

  2. LOJ - #117. 有源汇有上下界最小流(有源汇有上下界的最小流)

    题目链接:点击查看 题目大意:给出一个 n 个点和 m 条边的有向图,每条边都有一个流量限制 [ lower , upper ],给定源点 s 和汇点 t ,求出源点到汇点的最小流 题目分析:参考我的 ...

  3. POJ 2396 有上下界的可行流

    题意: 有一个n*m的方阵,里面的数字未知,但是我们知道如下约束条件: 每一行的数字的和 每一列的数字的和 某些格子有特殊的大小约束,用大于号,小于号和等于号表示 问:是否存在用正数填充这个方阵的方案 ...

  4. [bzoj3698]XWW的难题——有上下界的最大流

    题目大意: XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核. XWW给你出了这么一个难题:XWW给你一个N*N的正实数矩 ...

  5. ZOJ2314 Reactor Cooling(无源汇流量有上下界网络的可行流)

    题目大概说一个核反应堆的冷却系统有n个结点,有m条单向的管子连接它们,管子内流量有上下界的要求,问能否使液体在整个系统中循环流动. 本质上就是求一个无源汇流量有上下界的容量网络的可行流,因为无源汇的容 ...

  6. [BZOJ2502]清理雪道解题报告|带下界的最小流

    滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞 ...

  7. CodeForces - 1252L Road Construction(基环树+有源汇有上下界的最大流)

    题目链接:点击查看 题目大意:给出 n 个节点,再给出 n 个出边,保证所有的边能将 n 个点连通,每条出边可以用 m[ i ] 种材料选择其一建造,然后有 k 个工人,每个工人只可以使用一种材料建造 ...

  8. 洛谷 - P5192 Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流(有源汇有上下界的最大流)

    题目链接:点击查看 题目大意:一共有 n 天,每天可以拍最多 D[ i ] 张照片,每天可以选择 C[ i ] 个少女进行拍照,每个少女的编号为 T[ i ][ j ] ,每个少女需要拍摄照片的区间为 ...

  9. 【bzoj3876】【AHOI2014】【支线剧情】【有上下界的费用流】

    Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现 ...

最新文章

  1. IPv6时代的《TCP/IP详解》!
  2. OSPF被隔离的区域
  3. Mysql 各个版本区别
  4. 我是如何进入全球顶级AI实验室的 (1)
  5. Spring 3.2 @ControllerAdvice批注的异常处理
  6. 索引 mysql_深入理解MySQL索引
  7. 创意合成大片欣赏,进步都是从模仿开始
  8. redis 自增_坏了,Redis的字符串类型竟然被张三学明白了?
  9. 决策树算法小结(二) C4.5原理及代码实现
  10. Partition does not end on cylinder boundary
  11. LAMP(Linux+Apachd+Mysql+Php)搭建网站环境
  12. qt中的句柄类,实体类
  13. 在BAE tomcat环境下实现讯飞TTS在线文字转语音
  14. 双绞线的制作T568A线序,T568B线序
  15. 这个国庆,我去佛山看舞狮,太惊艳!
  16. 硬盘柱面损坏怎么办_硬盘0柱面损坏数据恢复(老牌数据恢复)
  17. Verilog除法器(32位无符号+带符号)
  18. 小猿圈python之python期末考试测试题(二)_小猿圈Python开发面试题(二)
  19. c语言程序实现进程的管道通信,C 进程间通信--命名管道通信代码实现及其原理图示...
  20. 保姆级教程—部署SpringBoot项目至云服务器(华为云)

热门文章

  1. 云炬随笔20211001
  2. [C++调试笔记]执行声明的读写文件操作
  3. 【web实战2】基于源码搭建小说自动采集网站
  4. 连表查询使用in_SQL 组合查询
  5. 线性判别分析LDA的数学原理(一)
  6. [计算机视觉:算法与应用]学习笔记一:图像形成
  7. 手动配置WCF宿主的.config文件遇到的几种错误
  8. linux_unix系统编程手册源代码编译
  9. Java泛型中的通配符?
  10. docker安装logstash及logstash配置