题意:有个N个点M个边的有向加权图,求1~N的两条不相交路径(除了起点和终点外没有公共点),使得权和最小。

解法:不相交?也就是一个点只能经过一次,也就是我后面博文会讲的“结点容量问题”。(呃不,写完这博文几天后的今天,我负责任地 m(._.)m 告诉大家,我不会写这博文了......我的时间不多了......          m(_ _;;m 大家可以看蓝书。)常用方法就是拆点法,把一个点拆成两个点,中间连一条容量为1、费用为0的边。于是求1到 n 的流量为2的最小费用流就可以了。

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<queue>
6 using namespace std;
7
8 const int N=1010,M=10010,NN=2010,MM=22000,D=110,INF=(int)1e9;
9 int n,m,len;
10 int last[NN],d[NN],vis[NN],flow[NN];
11 int pre[NN],id[NN];
12 struct edge{int x,y,fl,c,next;}e[MM];
13 queue<int> q;
14
15 int mmin(int x,int y) {return x<y?x:y;}
16 void ins(int x,int y,int fl,int c)
17 {
18 e[++len].x=x,e[len].y=y,e[len].fl=fl,e[len].c=c;
19 e[len].next=last[x],last[x]=len;
20 e[++len].x=y,e[len].y=x,e[len].fl=0,e[len].c=-c;
21 e[len].next=last[y],last[y]=len;
22 }
23 bool spfa(int st,int ed)
24 {
25 while (!q.empty()) q.pop();
26 memset(d,63,sizeof(d));//>1e9
27 memset(vis,0,sizeof(vis));
28 memset(pre,0,sizeof(pre));
29 q.push(st);
30 d[st]=0,vis[st]=1,flow[st]=INF;
31 while (!q.empty())
32 {
33 int x=q.front(); q.pop();
34 vis[x]=0;//spfa
35 for (int i=last[x];i;i=e[i].next)
36 {
37 int y=e[i].y;
38 if (d[x]+e[i].c<d[y] && e[i].fl)
39 {
40 d[y]=d[x]+e[i].c;
41 flow[y]=mmin(flow[x],e[i].fl);
42 pre[y]=x, id[y]=i;
43 if (!vis[y]) q.push(y),vis[y]=1;
44 }
45 }
46 }
47 return pre[ed];
48 }
49 int Max_flow(int st,int ed)
50 {
51 int sum=0;
52 while (spfa(st,ed))
53 {
54 sum+=flow[ed]*d[ed];
55 for (int i=ed;i!=st;i=pre[i])
56 {
57 e[id[i]].fl-=flow[ed];
58 e[id[i]^1].fl+=flow[ed];
59 }
60 }
61 return sum;
62 }
63 int main()
64 {
65 while (scanf("%d%d",&n,&m)!=EOF)
66 {
67 int x,y,z; len=1;
68 memset(last,0,sizeof(last));
69 for (int i=2;i<n;i++) ins(i,n+i-1,1,0);
70 ins(n,2*n-1,2,0);
71 //拆点就是真的拆点不能ins(i,i...) n+1~2n-2
72 for (int i=1;i<=m;i++)
73 {
74 scanf("%d%d%d",&x,&y,&z);
75 if (x!=1) x=n+x-1;//只有1没有拆多一个点
76 ins(x,y,1,z);
77 }
78 //for (int i=2;i<=len;i++)
79 // printf("%d %d %d %d %d\n",e[i].x,e[i].y,e[i].fl,e[i].c,e[i].next);
80 int ans=Max_flow(1,2*n-1);
81 printf("%d\n",ans);
82 }
83 return 0;
84 }

【uva 1658】Admiral(图论--网络流 最小费用最大流)的更多相关文章

  1. UVA 1658 海军上将(拆点法+最小费用限制流)

    海军上将 紫书P375 这题我觉得有2个难点: 一是拆点,要有足够的想法才能把这题用网络流建模,并且知道如何拆点. 二是最小费用限制流,最小费用最大流我们都会,但如果限制流必须为一个值呢?比如这题限制 ...

  2. 【bzoj 2597】[Wc2007]剪刀石头布(图论--网络流 最小费用最大流)

    题目:在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况.有的时候,无聊的人们会津津乐道于统计有多少这样的 ...

  3. 图论算法-最小费用最大流模板【EK;Dinic】

    图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...

  4. 网络流(最小费用最大流):POJ 2135 Farm Tour

    Farm Tour Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: ...

  5. HDU 6118 度度熊的交易计划(网络流-最小费用最大流)

    度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片区能够花费a[i]元生产1个商品,但 ...

  6. 网络流--最小费用最大流MCMF模板

    标准大白书式模板 #include<stdio.h> //大概这么多头文件昂 #include<string.h> #include<vector> #includ ...

  7. 洛谷P4003 [国家集训队2017]无限之环 网络流 最小费用最大流

    题意简述 有一个\(n\times m\)棋盘,棋盘上每个格子上有一个水管.水管共有\(16\)种,用一个\(4\)位二进制数来表示当前水管向上.右.下.左有个接口.你可以旋转除了\((0101)_2 ...

  8. POJ-2516-Minimum Cost(网络流, 最小费用最大流)

    链接: https://vjudge.net/problem/POJ-2516 题意: Dearboy, a goods victualer, now comes to a big problem, ...

  9. Minimum Cost 【POJ - 2516】【网络流最小费用最大流】

    题目链接 题意: 有N个商家它们需要货物源,还有M个货物供应商,N个商家需要K种物品,每种物品都有对应的需求量,M个商家每种物品都是对应的存货,然后再是K个N*M的矩阵表示了K个物品从供货商运送到商家 ...

随机推荐

  1. uber_go_guide解析(三)(规范)

    前言 一主要讲的是容易忽略的错误,可能在build时都不会体现出来但是在使用时出现问题 二主要讲的是一些可以提高代码效率的用法 本篇则讲解一些规范,不是强制的但是根据规范会提高代码的可读性, 减少BU ...

  2. 【Oracle】将数据库设为开机自启

    由于某些特殊条件,需要将oracle数据库设置为开机自己,其实很简单 环境:oracle10gR2 1.修改/etc/oratab # This file is used by ORACLE util ...

  3. 入门OJ:photo

    题目描述 有N个人,来自K个家族.他们排成一行准备照相,但是由于天生的排外性,每个人都希望和本家族的人站在一起,中间不要加入别的家族的人.问最少从队列中去掉多少个就可以达到这个目的. 输入格式 第一行 ...

  4. 如何在 crontab 中让 source ~/.bashrc 生效

    cron 是许多类 Unix 操作系统中都自带的用来调度定时任务的工具,定时任务的配置是写在 crontab 文件中的,但是 crontab 文件不允许直接编辑,一般都是通过命令 crontab -e ...

  5. websocket的应用---Django

    websocket的应用---Django 1.长轮询 轮询:在前端通过写js实现.缺点:有延迟.服务器压力大. 就是客户端通过一定的时间间隔以频繁请求的方式向服务器发送请求,来保持客户端和服务器端的 ...

  6. java虚拟机入门(四)-垃圾回收的故事

    谈到垃圾回收器,java程序员骄傲了起来,c语言你是够快,但是你有管家帮你打扫吗,还不是得靠自己的一双手,有钱就是任性.既然如此令java程序员骄傲的垃圾回收器,怎能让人不想去一探究竟呢! 垃圾回收器 ...

  7. Dapper原来还可以直接这样写SQL,很强大哦

    网络上对Dapper的解释是这样的: Dapper是一个简单的.NET对象映射器,在速度方面具有"King of Micro ORM"的头衔,几乎与使用原始的ADO.NET数据读取 ...

  8. git的使用学习笔记--项目版本操作

    一.使用场景 版本回退:上线失败--需要回退到上个版本 二.操作 先编辑  vim text.txt git status git add .       这个命令能看到所有的增加操作 git com ...

  9. 内存空间有限情况下的词频统计 Trie树 前缀树

    数据结构与算法专题--第十二题 Trie树 https://mp.weixin.qq.com/s/nndr2AcECuUatXrxd3MgCg

  10. logging philosophy 日志哲学

    Go kit - Frequently asked questions https://gokit.io/faq/ Logging - Why is package log so different? ...