啊哈!达

突然想到你,笑了笑自己。

USACO5.4 TSP_背包_网络流拆点

USACO5.4 TSP_背包_网络流拆点

tour 双调TSP&&传纸条模型

题意,给出一个图,从最东边到最西边再返回,求最多经过的城市,除了起始只能经过一次

  • 一开始想二分从左到右最多的城市,T
  • 而后从左边开始两条路同时搜索,T
  • DP,状态定义为同时走到i,j 城市的最大距离

    • [1,1] = 1,f[n,n] = 0(1<n<V),f[j,i] = f[i,j] = max(f[n,j] + 1)其中j到i有路,最后扫一遍f[v,j]就可以过了.
    • 因为f[n,n] = 0所以不会经过相同的城市
  • 最大费用流

    • 把第i个城市拆分成两个顶点

charrec

题意: 给出a~z的图像,然后给出另外一条图像求出对应字符串

输入文件包含一个或多个可能损坏的字符图案。一个字符图案可能以这些方式被损坏。

  • 最多有一行可能被复制了(就接在原来那一行的下面)
  • 最多有一行可能丢失了
  • 有些“0”可能被改成“1”
  • 有些“1”可能被改成“0”

不会有任何一个字符图案既多余了一行并且又丢失了一行。在测试数据的任何一个字符图案中,“0”和“1”的被改变率不超过 30%。

被复制的那一行中,原来的行和多余的行可能都损坏了,而且损坏的部分可能并不相同。

分析:

  1. dp,先预处理记录第c个字符的第i行与字符串第j行的dis值,再背包就好
  2. 因为要输出,可以用结构体记录前一个的位置.
  3. 对于三种不同的扩展每次找三个前卫就好了.

总结:

  1. 代码打烂了就重打,不要一昧调试凑数据没准还能找到错误地方(没错这题就是这么过的)
  2. WA很多次的原因是,,对应位置不是从0位开始dp的..
  3. 算法比赛中可以通过短字母+注释的方法缩短代码长度,减少畏惧心理

网络流拆点

题意:

给出n割点,m条无向边

求分割点a到点b最少+最小割点集合

一开始IDDFS和二分都T在第八个数据

  • 拆点:

    • 把每个点拆为i*2i*2+1,连一条边,权值1
    • 原始边添加从a*2+1b*2和从b*2+1a*2的两条权值为inf的边
    • 然后最大流,,枚举删除点(两个)(因为这里有删除,所以dinic的bfs中条件加一个删除)
  • 因为没有重新初始化错了(删点后的最大流需要初始化)

    for (int i = 2; i <= nume ; i++) {
          if (i % 2 == 0) {
              e[i].f += e[i^1].f;
          }else
              e[i].f = 0;
      }
  • 因为空间分配小了错了两次

阅读更多
文章标签: 算法
个人分类: 算法 USACO SYSU
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭