Description

给出一张\(N\)个点\(M\)条边的带权无向图,结点编号从\(1\)到\(N\),求从\(1\)到\(N\)再到\(1\)的最短路,每条边最多走一次。

Input

第一行给出两个整数\(N\)和\(M\),表示结点数和边数。
接下来的\(M\)行每行给出三个整数\(u\),\(v\)和\(w\),表示一边的两个端点和边权。
\(1 \leqslant N \leqslant 1000\),\(1 \leqslant M \leqslant 10000\)。

Output

输出一个整数表示最短路径的长度。

Sample Input

4 5
1 2 1
2 3 1
3 4 1
1 3 2
2 4 2

Sample Output

6

Solution

要求两条不重叠的最短路就不能用简单最短路算法了,先求最短路,删边再求最短路也不行,于是用最小费用最大流。对于一条权重为\(w\)的无向边,花费为\(w\)的有向边,因为每条边最多走一次,因此容量设为\(1\),又因为只求两条路径,故添加额外源点\(0\),与结点\(1\)建一条容量为\(2\)花费为\(0\)的边,从源点\(0\)到汇点\(N\)跑最小费用最大流即可。

Code

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 1e3 + 10;
const int M = 4e4 + 10;struct Edge
{int from, to, next, cap, cost;Edge() {}Edge(int from, int to, int next, int cap, int cost) : from(from), to(to), next(next), cap(cap), cost(cost) {}
} edge[M];
int head[N], tot;void add(int from, int to, int cap, int cost)
{edge[tot] = Edge(from, to, head[from], cap, cost);head[from] = tot++;edge[tot] = Edge(to, from, head[to], 0, -cost);head[to] = tot++;
}void init()
{memset(head, -1, sizeof(head));tot = 0;
}int dis[N], pre[N];
bool vis[N];
queue<int> q;
bool spfa(int s, int t)
{while (!q.empty()) q.pop();memset(dis, 0x3f, sizeof(dis));memset(vis, false, sizeof(vis));memset(pre, -1, sizeof(pre));q.push(s); vis[s] = true; dis[s] = 0;     while (!q.empty()) {int u = q.front(); q.pop(); vis[u] = false;for (int i = head[u]; i != -1; i = edge[i].next) if (edge[i].cap && dis[u] + edge[i].cost < dis[edge[i].to]) {int v = edge[i].to;dis[v] = dis[u] + edge[i].cost;pre[v] = i;if (!vis[v]) q.push(v), vis[v] = true;}}return dis[t] < INF;
}int mcmf(int s, int t)
{int mincost = 0, maxflow = 0;while (spfa(s, t)) {int flow = INF;for (int i = pre[t]; i != -1; i = pre[edge[i].from]) flow = min(flow, edge[i].cap);for (int i = pre[t]; i != -1; i = pre[edge[i].from]) {edge[i].cap -= flow;edge[i ^ 1].cap += flow;mincost += edge[i].cost * flow;}maxflow += flow;}return mincost;
}int main()
{int n, m;scanf("%d%d", &n, &m);init();while (m--){int u, v, c;scanf("%d%d%d", &u, &v, &c);add(u, v, 1, c);add(v, u, 1, c);}add(0, 1, 2, 0);int ans = mcmf(0, n);printf("%d\n", ans);return 0;
}

Link

http://poj.org/problem?id=2135

转载于:https://www.cnblogs.com/dadamrx/p/7358148.html

POJ 2135 Farm Tour (最小费用最大流)相关推荐

  1. POJ - 2135 Farm Tour(最小费用最大流)

    题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的无向图,每条边都有权值,求点1->点n->点1的最短路,且要求每条路至多经过一次,并使得途径的权值和最小 题目分析:虽然题目要求 ...

  2. POJ 2135 Farm Tour (费用流)

    [题目链接] http://poj.org/problem?id=2135 [题目大意] 有一张无向图,求从1到n然后又回来的最短路 同一条路只能走一次 [题解] 题目等价于求从1到n的两条路,使得两 ...

  3. POJ - 2516 Minimum Cost 最小费用最大流

    题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...

  4. POJ - 2175 Evacuation Plan(最小费用最大流+消圈定理)

    题目链接:点击查看 题目大意:给出n个建筑物和m个避难所,每个建筑物中的人需要到避难所中去避难,规定花费是建筑物和避难所的曼哈顿距离+1,现在给出一种路线方案,问这个方案是不是最优的,如果不是,输出比 ...

  5. POJ - 2516 Minimum Cost(最小费用最大流)

    题目链接:点击查看 题目大意:给出n个买家,m个货点,以及k种货物,接下来按照顺序依次给出一个n*k的矩阵,表示每个买家对于每种货物的需求,一个m*k的矩阵,表示每个货点能供给货物的数量,k个n*m的 ...

  6. POJ 2195 Going Home 最小费用最大流

    这题目同时也可以用KM()算法做,最求小权值匹配而已,权值设置为负数就行,具体KM算法参照:http://blog.csdn.net/cnh294141800/article/details/1895 ...

  7. POJ 2135 Farm Tour 最小费用流

    两条路不能有重边,既每条边的容量是1.求流量为2的最小费用即可. //#pragma comment(linker, "/STACK:1024000000,1024000000") ...

  8. POJ 2135 Farm Tour amp;amp; HDU 2686 Matrix amp;amp; HDU 3376 Matrix Again 费用流求来回最短路...

    累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...

  9. poj 2516(最小费用最大流)

    其实题意很明确,最小费用最大流, 但是我这2货就建图就太二了, 我把所有的情况都弄到一个图里面. 总的点数有5000个,加上这么多的边,果断TLE... 后面知道第k个的情况是独立的,所以可以分成K次 ...

最新文章

  1. 文件服务器raid1设置,文件服务器raid1设置
  2. UI之UI View--属性及用法
  3. 用字体在网页中画Icon图标
  4. ffmpeg 把视频解码成jpg
  5. maven工程如何引用css和js文件
  6. PAT_B_1095_Java(25分)
  7. linux安全加固_安全服务之安全评估与加固
  8. python模块_python模块
  9. 用一个小的例子来说明为什么TCP采用三次握手才能保证连接成功
  10. 小学计算机知识点,小学信息技术单元知识点目录介绍
  11. Tomcat性能调优及JVM内存工作原理
  12. javascript 函数传参
  13. 计算机逆向工程专业,计算机软件反向工程的合法性研究
  14. Java编写的“滑稽”表情屏保程序
  15. LeetCode刷题之路:781. 森林中的兔子
  16. 一个男人的品位在于选择妻子
  17. ubuntu etc 设置权限777带来的问题
  18. python枚举窗口句柄_如何使用 WIN32 API 枚举窗口?
  19. 分析google adsence
  20. 解决qq安全防护更新进程总提示的方法

热门文章

  1. 你现在可以使用的10个JavaScript代码段
  2. dnn神经网络_【李宏毅机器学习笔记】深度神经网络(DNN)
  3. linux启动写入了mbr,一、Linux系统启动(MBR)
  4. mysql組合主鍵_MySQL(二)
  5. ajax 模拟表单提交,Ajax模拟Form表单提交,含多种数据上传
  6. 下次激活策略10_(好文重读)低风险之可转债4大卖出策略
  7. 计算机上的框英文,电脑打开steam平台弹出一个英文框的解决方法
  8. 重庆计算机考试准考证打印入口,重庆西南大学计算机等级考试准考证打印入口...
  9. php漂亮按钮代码,分享一款金属感十足的按钮样式代码
  10. ios如何看idfv_ios获取手机状态 idfa   idfv   网络类型   分辨率   获取运营商