【最小费用最大流模板】【Uva10806+Spring Team PK】Dijkstra, Dijkstra,
题意:从1到n 再从n到1 不经过重复的边 ,(如果是点就是旅行商问题了),问最短路
建立一个超级源S S到1连一条费用为0,容量为2的边,求费用流即可
如果流<2 那么hehe
否则 输出结果
模板来自Kuangbing 如下:
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <cstring>
- #include <ctime>
- #include <algorithm>
- #include <iostream>
- #include <sstream>
- #include <string>
- #include <queue>
- #define oo 0x13131313
- using namespace std;
- const int MAXN=200;
- const int MAXM=200000;
- const int INF=0x3f3f3f3f;
- struct Edge
- {
- int to,next,cap,flow,cost;
- void get(int a,int b,int c,int d)
- {
- to=a,cap=b,cost=c;next=d;flow=0;
- }
- }edge[MAXM];
- int head[MAXN],tol;
- int pre[MAXN],dis[MAXN];
- bool vis[MAXN];
- int N;
- void init(int n)
- {
- N=n;
- tol=0;
- memset(head,-1,sizeof(head));
- }
- void addedge(int u,int v,int cap,int cost)
- {
- edge[tol].get(v,cap,cost,head[u]);head[u]=tol++;
- edge[tol].get(u,0,-cost,head[v]);head[v]=tol++;
- }
- bool spfa(int s,int t)
- {
- queue<int>q;
- for(int i=0;i<N;i++)
- {
- dis[i]=INF;
- vis[i]=false;
- pre[i]=-1;
- }
- dis[s]=0;
- vis[s]=true;
- q.push(s);
- while(!q.empty())
- {
- int u=q.front();
- q.pop();
- vis[u]=false;
- for(int i= head[u];i!=-1;i=edge[i].next)
- {
- int v=edge[i].to;
- if(edge[i].cap>edge[i].flow&&
- dis[v]>dis[u]+edge[i].cost )
- {
- dis[v]=dis[u]+edge[i].cost;
- pre[v]=i;
- if(!vis[v])
- {
- vis[v]=true;
- q.push(v);
- }
- }
- }
- }
- if(pre[t]==-1) return false;
- else return true;
- }
- int minCostMaxflow(int s,int t,int &cost)
- {
- int flow=0;
- cost = 0;
- while(spfa(s,t))
- {
- int Min=INF;
- for(int i=pre[t];i!=-1;i=pre[edge[i^1].to])
- {
- if(Min >edge[i].cap-edge[i].flow)
- Min=edge[i].cap-edge[i].flow;
- }
- for(int i=pre[t];i!=-1;i=pre[edge[i^1].to])
- {
- edge[i].flow+=Min;
- edge[i^1].flow-=Min;
- cost+=edge[i].cost*Min;
- }
- flow+=Min;
- }
- return flow;
- }
- int main()
- {
- }
完整代码如下:
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <cstring>
- #include <ctime>
- #include <algorithm>
- #include <iostream>
- #include <sstream>
- #include <string>
- #include <queue>
- #define oo 0x13131313
- using namespace std;
- const int MAXN=200;
- const int MAXM=200000;
- const int INF=0x3f3f3f3f;
- struct Edge
- {
- int to,next,cap,flow,cost;
- void get(int a,int b,int c,int d)
- {
- to=a,cap=b,cost=c;next=d;flow=0;
- }
- }edge[MAXM];
- int head[MAXN],tol;
- int pre[MAXN],dis[MAXN];
- bool vis[MAXN];
- int N;
- void init(int n)
- {
- N=n;
- tol=0;
- memset(head,-1,sizeof(head));
- }
- void addedge(int u,int v,int cap,int cost)
- {
- edge[tol].get(v,cap,cost,head[u]);head[u]=tol++;
- edge[tol].get(u,0,-cost,head[v]);head[v]=tol++;
- }
- bool spfa(int s,int t)
- {
- queue<int>q;
- for(int i=0;i<=N;i++)
- {
- dis[i]=INF;
- vis[i]=false;
- pre[i]=-1;
- }
- dis[s]=0;
- vis[s]=true;
- q.push(s);
- while(!q.empty())
- {
- int u=q.front();
- q.pop();
- vis[u]=false;
- for(int i= head[u];i!=-1;i=edge[i].next)
- {
- int v=edge[i].to;
- if(edge[i].cap>edge[i].flow&&
- dis[v]>dis[u]+edge[i].cost )
- {
- dis[v]=dis[u]+edge[i].cost;
- pre[v]=i;
- if(!vis[v])
- {
- vis[v]=true;
- q.push(v);
- }
- }
- }
- }
- if(pre[t]==-1) return false;
- else return true;
- }
- int minCostMaxflow(int s,int t,int &cost)
- {
- int flow=0;
- cost = 0;
- while(spfa(s,t))
- {
- int Min=INF;
- for(int i=pre[t];i!=-1;i=pre[edge[i^1].to])
- {
- if(Min >edge[i].cap-edge[i].flow)
- Min=edge[i].cap-edge[i].flow;
- }
- for(int i=pre[t];i!=-1;i=pre[edge[i^1].to])
- {
- edge[i].flow+=Min;
- edge[i^1].flow-=Min;
- cost+=edge[i].cost*Min;
- }
- flow+=Min;
- }
- return flow;
- }
- int NN,MM;
- void input()
- {
- int a,b,c;
- for(int i=1;i<=MM;i++)
- {
- scanf("%d%d%d",&a,&b,&c);
- addedge(a,b,1,c);
- addedge(b,a,1,c);
- }
- }
- void solve()
- {
- int ANS=0,t;
- addedge(NN+1,1,2,0); //建立源S=NN+1;
- t=minCostMaxflow(NN+1,NN,ANS);
- if(t==2) printf("%d\n",ANS);
- else printf("hehe\n");
- }
- void File()
- {
- freopen("a.in","r",stdin);
- freopen("a.out","w",stdout);
- }
- int main()
- {
- // File();
- while(cin>>NN>>MM)
- {
- init(NN+1);
- input();
- solve();
- }
- }
【最小费用最大流模板】【Uva10806+Spring Team PK】Dijkstra, Dijkstra,的更多相关文章
- 图论算法-最小费用最大流模板【EK;Dinic】
图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...
- HDU3376 最小费用最大流 模板2
Matrix Again Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)To ...
- 洛谷P3381 最小费用最大流模板
https://www.luogu.org/problem/P3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...
- 最大流 && 最小费用最大流模板
模板从 这里 搬运,链接博客还有很多网络流题集题解参考. 最大流模板 ( 可处理重边 ) ; const int INF = 0x3f3f3f3f; struct Edge { int from ...
- Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的 ...
- 【网络流#2】hdu 1533 - 最小费用最大流模板题
最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...
- poj 2195 最小费用最大流模板
/*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...
- POJ2135 最小费用最大流模板题
练练最小费用最大流 此外此题也是一经典图论题 题意:找出两条从s到t的不同的路径,距离最短. 要注意:这里是无向边,要变成两条有向边 #include <cstdio> #include ...
- POJ 2135 Farm Tour (最小费用最大流模板)
题目大意: 给你一个n个农场,有m条道路,起点是1号农场,终点是n号农场,现在要求从1走到n,再从n走到1,要求不走重复路径,求最短路径长度. 算法讨论: 最小费用最大流.我们可以这样建模:既然要求不 ...
随机推荐
- rsync常用参数详解
rsync常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在linux中,一切皆是文件,包括你的终端,硬件设备信息,目录,内核文件等等.所以工作中我们难免会遇到拷贝文件 ...
- SQL注入原理深度解析
本文转自:http://www.iii-soft.com/forum.php?mod=viewthread&tid=1613&extra=page%3D1 对于Web应用来说,注射式攻 ...
- docker 实战---使用oracle xe作为开发数据库(六)
oracle作为oltp的大佬,非常多行业应用都会用到它.那么在开发的过程中就不可避免的要使用oracle数据库,oracle数据库的版本号有好多,当中express版本号是免费的开发版.它的主要限制 ...
- freemarker声明变量
freemarker声明变量 1.使用assign创建和替换变量 (1)新建声明变量的ftl variable.ftl: <html> <head> <meta http ...
- 加载本地html遇到的问题
之前要做一个Demo,需要用UIWebView来加载网页,前端的同事把资源包给我,里面包含html,css,JavaScript,图片等文件.我想当然的把文件夹拷到工程中,然后用以下方法加载: NSU ...
- 【二分图最大匹配】【HDU2063】过山车
[科普]什么是BestCoder?如何参加? 过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- ECShop2.7.2详细文件结构及模板结构目录名称
┣plugins目录┣templates目录┃ ┣backup目录┃ ┃ ┣index.htm┃ ┃ ┗ibrary目录┃ ┃ ┗index.htm┃ ┣cac ...
- JavaScript 【正则表达式验证数字代码】
可以看到 Ajax 请求多了个 x-requested-with ,可以利用它,request.getHeader("x-requested-with"); 为 null,则为传统 ...
- canvas入门
<html> <head> <script> window.onload=function(){ var canvas=document.getElementByI ...
- (转)C/C++中static关键字
下面的转自http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html 静态变量作用范围在一个文件内,程序开始时分配空间,结束 ...