Description:
给一个DAGDAGDAG图,记边是从aiaia_i到bibib_i,边权cicic_i,要从000走到n" role="presentation" style="position: relative;">nnn,求最短路。
保证ai<biai<bia_i ,而且不存在ai<aj<bi<bjai<aj<bi<bja_i 每个点有一个颜色,每种颜色在路径上要么不经过,要么全部经过


Solution:
吐槽:考试的时候几乎想出了正解,可惜不会建对偶图就gggggg了。

首先我们把连成一条线的边变成一个环,一个环的边变成一条线,这样最小割对应的也就是一条路径。然后考虑颜色限制,那么划分完区间后,每种区间里的颜色意味着如果选了这个颜色那么区间也得选。把每种颜色对应的区间互相连infinfinf即可。最后每个点向父亲连边,用来判无解。


#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005, inf = 0x3f3f3f3f;
struct edge {int nxt, to, f;
} e[2000005];
int n, m, ans, cnt = 1, source, sink, tot = 1;
int h[maxn], iter[maxn], d[maxn], c[maxn];
vector<int> col[maxn], G[maxn], w[maxn];
void link(int u, int v, int f) {e[++cnt].nxt = h[u];h[u] = cnt;e[cnt].to = v;e[cnt].f = f;
}
void insert(int u, int v, int f) {link(u, v, f);link(v, u, 0);
}
bool bfs() {queue<int> q;q.push(source);memset(d, -1, sizeof(d));d[source] = 0;while(!q.empty()) {int u = q.front();q.pop();for(int i = h[u]; i; i = e[i].nxt) {if(d[e[i].to] == -1 && e[i].f) {d[e[i].to] = d[u] + 1;q.push(e[i].to);}}}return d[sink] != -1;
}
int dfs(int u, int delta) {if(u == sink) {return delta;}int ret = 0;for(int &i = iter[u]; i; i = e[i].nxt) {if(d[e[i].to] == d[u] + 1 && e[i].f) {int x = dfs(e[i].to, min(delta, e[i].f));e[i].f -= x;e[i ^ 1].f += x;delta -= x;ret += x;if(!delta) {break;}}}return ret;
}
int dinic() {int ret = 0;while(bfs()) {memcpy(iter, h, sizeof(h));ret += dfs(source, inf);ret = min(ret, inf);}return ret;
}
class ColorfulPath {public: void build(int l, int r, int fa) {for(int x = l; x < r; ) {int y = 0, p = 0, m = G[x].size();if(x ^ l) {col[c[x]].push_back(fa);}for(int i = 0; i < m; ++i) {if(G[x][i] > y) {y = G[x][i];p = i;}}if(!y) {insert(fa, sink, inf);for(int i = l + 1; i < r; ++i) {col[c[i]].push_back(fa);}return;} else {G[x][p] = 0;++tot;insert(fa, tot, w[x][p]);insert(tot, fa, inf);                   build(x, y, tot);x = y;              }}}int shortestPath(vector<int> a, vector<int> b, vector<int> cost, vector<int> color) {sink = 1;n = color.size() + 1;int m = a.size();for(int i = 0; i < m; ++i) {G[a[i]].push_back(b[i]);w[a[i]].push_back(cost[i]);}for(int i = 1; i < n; ++i) {c[i] = color[i - 1];}build(0, n, source);for(int i = 1; i <= 1000; ++i) {m = col[i].size();for(int j = 1; j < m; ++j) {insert(col[i][j - 1], col[i][j], inf);insert(col[i][j], col[i][j - 1], inf);}}int ans = dinic();return ans >= inf ? -1 : ans;}
};

Topcoder 2016 TCO Algorithm Algo Semifinal 1 Hard ColorfunPath [网络流]相关推荐

  1. Topcoder 2016 TCO Algorithm Algo Semifinal 1 Hard

    链接:https://community.topcoder.com/stat?c=problem_statement&pm=14447&rd=16839 题意:给一个DAG图,记边是从 ...

  2. Topcoder 2016 TCO Algorithm Algo Semifinal 2 Hard

    链接:https://community.topcoder.com/stat?c=problem_statement&pm=14436&rd=16841 题意:对于一个大小为k的线性基 ...

  3. 2016 TCO Algorithm 1B SettingShield

    题目大意 有h个普通栅栏,一个特殊栅栏和n棵植物 第i棵植物位于第i个单位 对于第i个普通栅栏有其保护的区间l[i]到r[i],特殊栅栏的保护区间是1到n 每个栅栏有一个非负整数s[i],表示它的强度 ...

  4. algorithm java_Java KeyPairGenerator getAlgorithm()用法及代码示例

    java.security.KeyPairGenerator类的getAlgorithm()方法用于返回此 key 对生成器的算法的标准名称.有关标准算法名称的信息,请参见Java密码体系结构标准算法 ...

  5. Topcoder口胡记 SRM 562 Div 1 ~ SRM 599 Div 1

    据说做TC题有助于提高知识水平? :) 传送门:https://284914869.github.io/AEoj/index.html 转载请注明链接:http://www.cnblogs.com/B ...

  6. 韵乐x5最佳参数手动_4种超参数调整技术及其局限性

    每个数据科学家都应该知道的主流的超参数调整技术 导读 ML工作流中最困难的部分之一是为模型找到最好的超参数.ML模型的性能与超参数直接相关.超参数调优的越好,得到的模型就越好.调优超参数可能是非常乏味 ...

  7. 【超全面】机器学习中的超参优化方法总结

    目录 1. 什么是超参数 2. 超参数类型 3. 主流超参优化方法 (1)手动调参 缺点: python代码:(例子) 手动调参 参数的重要性顺序 超参具体如何影响模型性能 超参合适的范围 (2)网格 ...

  8. android 文件加密的密码在哪里,android手机密码password.key文件加密方式?

    满意答案 Joywhenny 2016.04.17 采纳率:53%    等级:9 已帮助:5216人 参考 Android Forensics May 27 加密是类似下面的方法,盐值是在/data ...

  9. 机器学习训练营-基于XGBoost的分类预测学习笔记

    文章目录 前言 一.学习知识点概要 二.学习内容 1 XGBoost的应用及优缺点 1.1 XGBoost的应用 1.2 XGBoost的优缺点 2 基于天气数据集的XGBoost分类实战 2.1 目 ...

最新文章

  1. css3的3d起步——分享
  2. 接口使用jwt返回token_JWT实现token验证
  3. 算法导论读书笔记(8)
  4. oracle po:默认申请分组,PR自动创建PO采购订单:强制按照PR行进行分组
  5. 485转换器产品功能特点及技术参数介绍
  6. 案例精解企业级网络构建
  7. Wpf 数据绑定简介、实例1
  8. mysql 并发 压测工具_MySQL压测工具mysqlslap的介绍与使用
  9. 教你50招提升ASP.NET性能(二十六):对于开发人员的数据库性能技巧
  10. linux 测试本地端口是否打开,有效地测试Linux上的端口是否打开?
  11. 电脑仙人掌机器人作文_暑假有空来练笔——2019各地小学期末作文题目集锦
  12. 微信平台注册APP签名获取方法
  13. LinkTrack UWB定位系统NLink协议解析方法
  14. linux内核和发行版有什么区别?附镜像包以及如何查看Linux系统内核版本和发行版本
  15. CSS 中的 initial、inherit、unset、revert、all
  16. YL杯超级篮球赛_纪中1325_带权中位数
  17. 寻找志同道合者共同成立写作小组
  18. 表单数据序列化之serialize()、serializeArray()方法的使用
  19. 达芬奇密码 第六章(3)
  20. 运算符 狂神说Java随堂笔记

热门文章

  1. 需求分析挑战之旅(疯狂的订餐系统)(7)——变被动为主动
  2. Pytorch使用VGG做迁移学习(基于 CIFAR100 数据集)
  3. JSON 格式化和校验工具
  4. Java面试题集(1-50)
  5. 业务数据激增,4张图看清zData如何助力金融企业快速响应IT需求
  6. 盛世昊通董车长2.0“后“积薄发,点爆汽车后市场
  7. python均匀分布
  8. ibm服务器做系统按f几,这是我的主板,请问开机启动热键按F几?
  9. GPGPU基础(二):GPGPU需要用到的OpenGL概念
  10. 何有效提高香港主机的访问速度?