Farm Tour
来源:互联网 发布:在线排课软件 编辑:程序博客网 时间:2024/06/05 06:33
题意:一个人带领一位朋友游历他的牧场,他的房子在第一个点,仓库在第N个点。求解从第一个点出发到达第n个点后在返回,最短的路径,每个点只能走一次。
思路:费用流。建图:源点与第一个点建一条边花费2,流量0。第n个点与汇建立一条边,费用2,流量0,其他各点建图,费用1,流量为给出值。用MFMC模板求解。
#include<stdio.h>#include<string.h>#include<queue>#include<math.h>#include<iostream>using namespace std;#define inf 0xfffffff#define M 1005struct node{ int x, y;};int tem[M][M];int n, m, len;struct edge{ int v, w, flow, c, next;} edge[M * M * 10];int vst[M], dis[M], head[M], pre[M];//dis记录路径长度int tot, flow_sum;void add(int v, int w, int f, int c){ edge[tot].v = v; edge[tot].w = w; edge[tot].flow = f; edge[tot].c = c; edge[tot].next = head[v]; head[v] = tot++; edge[tot].v = w; edge[tot].w = v; edge[tot].flow = 0; edge[tot].c = -c; edge[tot].next = head[w]; head[w] = tot++;}//MCMF开始bool spfa(int begin, int end) //spfa求解最短路径,即增广链中最小费用{ int v, w; queue < int >q; for (int i = 0; i <= end + 2; i++) { pre[i] = -1; vst[i] = 0; dis[i] = inf; } vst[begin] = 1; dis[begin] = 0; q.push(begin); while (!q.empty()) { v = q.front(); q.pop(); vst[v] = false; for (int i = head[v]; i != -1; i = edge[i].next) { if (edge[i].flow > 0) { w = edge[i].w; if (dis[w] > dis[v] + edge[i].c) { dis[w] = dis[v] + edge[i].c; pre[w] = i; if (!vst[w]) { vst[w] = true; q.push(w); } } } } } return dis[end] != inf;}int MCMF(int begin, int end){ int ans = 0, flow, i; flow_sum = 0; while (spfa(begin, end)) { flow = inf; for (i = pre[end]; i != -1; i = pre[edge[i].v]) if (edge[i].flow < flow) flow = edge[i].flow;//找增广链上所有边的容量的最小值作为“可分配最大流” for (i = pre[end]; i != -1; i = pre[edge[i].v]) { edge[i].flow -= flow; //正向弧加 edge[i^1].flow += flow; //反向弧减 } ans += dis[end]; flow_sum += flow; //总流量 } // cout << flow_sum << endl; return ans; // 返回最小费用}int main(){ int i, j; int s,e,c; while (scanf("%d%d", &n, &m) != EOF) { tot = 0; memset(head, -1, sizeof (head)); for (i = 1; i <=m; i++) { cin>>s>>e>>c; add(s,e,1,c); add(e,s,1,c); } add(0, 1, 2, 0); add(n, n+1, 2, 0); cout << MCMF(0, n + 1) << endl; } return 0;}/*4 51 2 12 3 13 4 11 3 22 4 24 51 2 22 3 13 4 11 3 22 4 267*/
- Farm Tour
- Farm Tour
- POJ 2135 Farm Tour
- poj 2135 Farm Tour
- poj 2135 Farm Tour
- poj 2135 Farm Tour
- poj 2135 Farm Tour
- poj2135 - Farm Tour
- POJ 2135-Farm Tour
- POJ 2135 Farm Tour
- POJ-2135-Farm Tour
- POJ 2135 Farm tour
- POJ 2135 Farm Tour
- poj2135 Farm Tour
- POJ 2135 Farm Tour
- poj 2135 Farm Tour
- poj 2135 Farm Tour
- poj2135--Farm Tour
- hduoj1047,Integer Inquiry,大数加法,跟poj某一题一样,再谈
- 操作系统 图形窗口 子系统
- QStyle的使用及范例
- 主键约束和唯一性约束的区别
- Git 远程分支创建与管理
- Farm Tour
- C/C++ 内存分配里的 堆和栈 与数据结构里的 堆和栈
- 我国留学低龄化趋势显著-家长失望国内应试教育-留学-低龄化-教育改革
- Windows 7与CUDA架构的兼容性测试
- 什么是尾部递归
- 本地计算机上的 Apache Tomcat7.0 Tomcat7服务启动后停止
- HDU-4408-Minimum Spanning Tree
- mySQL优化 my.ini 配置说明
- 都是线程若得祸